线程radixsort速度不快
我很难理解为什么我的实现速度不比单个线程更快. i正在尝试实现具有一定数字(n)线程的位基MSB-Radixsort(目前正在工作). 在我的方法中,我创建一个新线程,直到递归中的log2(n)为止.但这似乎只是增加了线程创建的时间原因. 我猜想创建的线程也无法同时在数组上工作,即使在其中分配了责任. 如果有人可以解释它,我真的很感激.谢谢! 更新:: 事实证明,正如乌尔里希(Ulrich)评论的那样,我缺少最明显的解决方案.我正在使用锁定到一个CPU的VM,我不知道它确实如此.更改后,我得到了Radixsort的所需加速. 感谢大家对该主题的评论和一般信息. ^^ 解决方案 如果每个核心具有超线程,则最大线程数应限于系统上的内核数,或者是内核数的两倍.从那以后,您已经更新了您的问题,请注意,您只使用虚拟机有一个核心,并且多线程的多核速度更快. 其他潜在问题:如果数据的分布不统一,则分为垃圾箱将导致大小不均匀的垃圾箱.使用大于2(例如256)的
12 2024-04-23
编程技术问答社区
在编译代码时出现错误'双倍自由或损坏(out)'在C语言中使用线程?
我正在尝试使用PTHREADS进行埃博拉模拟.一切都可以在信号范围内效果. 编译代码时,我会遇到此错误: *** Error in `./ebola_serial': double free or corruption (out): 0x00007f49700008c0 *** *** Error in `======= Backtrace: ========= /lib64/libc.so.6(+0x7238e)[0x7f49868f038e] ./ebola_serial/lib64/libc.so.6(+0x7a0c8)[0x7f49868f80c8] ': /lib64/libc.so.6(cfree+0x48)[0x7f49868fb798] double free or corruption (out)/lib64/libc.so.6(fclose+0x113)[0x7f49868e6473] ./ebola_serial[0x401717]
8 2024-04-10
编程技术问答社区
调用同一个函数时的线程问题
我正在尝试创建给定函数的4个实例,但是很难弄清楚该函数如何知道线程. 这在我的标题文件中: // GPIO PINS stored within structs, for each sonic range finder. typedef struct sonicPins { // front left pins. int trig1; int echo1; // front right pins. int trig2; int echo2; // rear left pins. int trig3; int echo3; // rear right pins. int trig4; int echo4; } args; void* setup(void *pinsPtr); extern int threadFunc(); 这在我的C文件中. int threadFun
10 2024-04-10
编程技术问答社区
是否有可能从子代中获得父代线程ID?
我正在尝试将仪器添加到我的代码中,以打印出 之类的东西 '线程1叉线2' 关于我如何实现这一目标的任何建议? 解决方案 术语校正:一个线程可能 create 另一个线程,而不是 fork ,通常是 用于提及一个过程. 否,线程无法获取另一线程的标识符.在Linux上,您可以检查gettid() == getpid()是否以查找是否是主线程. Solaris具有 thr_main()呼叫者是否是主线程. freebsd具有但是没有办法识别任何线程之间的亲子关系.任何线程都可以创建更多线程.在创建线程或使用全局数据结构时,您必须使用通过线程标识符来维护此信息.
16 2024-04-10
编程技术问答社区
C语言中使用信号量的生产者-消费者
使用信号量编写生产者消费者问题.在下面的代码中,创建消费者时存在同步执行的问题.为了解决该解决方案,在消费者的开关块中添加了睡眠声明. 请帮助我提供有效的同步解决方案.改进代码的任何建议确实很有帮助. #include #include #include #include /* sem_t */ #include #define BUF_SIZE 2 struct buffer { int data; }; struct buffer buf[BUF_SIZE]; sem_t fill, empty; int value, i; void *producer(void *data); void *consumer(void *data); int main(void) { int sel, prod_data, cons_data;
12 2024-04-10
编程技术问答社区
如何使用这个方法来杀死线程阵列?
此代码工作正常,但是如何使用它来杀死其余线程? #include #include #include void *print1(void *tid) { pthread_t *td= tid; pthread_mutex_t lock1=PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&lock1); printf("1"); printf("2"); printf("3"); printf("4\n"); printf("Coming out of thread1 \n"); sleep(2); pthread_mutex_unlock(&lock1); pthread_kill(*td,SIGKILL);//killing remaining all threads retu
8 2024-04-10
编程技术问答社区
Pthread_t未启动
我写了这个简短的示例,以了解C中的线程编程.它应该写入"线程0".但是没有输出. 这是代码. #include #include #include int i=0; pthread_mutex_t mutex; void * fonction(){ pthread_mutex_lock(&mutex); printf("thread %d \n",i++); pthread_mutex_unlock(&mutex); pthread_exit(NULL); } int main(){ pthread_t a; pthread_mutex_init(&mutex,NULL); pthread_create(&a,NULL,fonction,NULL); return EXIT_SUCCESS; } 有人可以帮我吗? PS:我用它来编译 gc
16 2024-04-10
编程技术问答社区
C- POSIX线程基础知识
我正在学习POSIX线程的基础知识.我想创建一个打印" Hello World!"的程序.每次打印输出之间有10次延迟一秒钟.我已经使用了用于循环打印10次,但是我一直坚持如何实现时间延迟部分. 到目前为止,这是我的代码: #define MAX 10 void* helloFunc(void* tid) { printf("Hello World!\n", (int)(intptr_t)tid); } int main(int ac, char * argv) { pthread_t hej[MAX]; for (int i = 0; i
6 2024-04-10
编程技术问答社区
使用多线程的单词计数程序。文件尺寸大
我正在尝试编写一个程序,该程序将在大文件中计算单词.我正在做多线程.但是我的程序给出了细分错误,我只是被困在这里.我正在寻找导师的任何建议:代码如下: 输入:file name 输出:分割故障 代码是: #include #include #include struct thread_data{ FILE *fp; long int offset; int start; int blockSize; }; int words=0; void *countFrequency(void* data){ struct thread_data* td=data; char *buffer = malloc(td->blockSize); int i,c; i=0;c=0; enum states { WHITESPACE
10 2024-04-10
编程技术问答社区
POSIX线程,唯一执行
有没有办法确保只有1个线程执行特定功能? for (i = startnotfirst; i p[i].cost / z); if (to_open) { //printf("\nRANDOM: %f \nINT_MAX: %d \npointsDistance(cost): %f \nZ: %f \n\n RESULT: %f p[1].cost , z,(rand / (float) INT_MAX),(points->p[
12 2024-04-10
编程技术问答社区
在linux中使用pthread_join是必须的吗?
我的学习pthread我有几个问题. 这是我的代码: #include #include #include #include #define NUM_THREADS 10 using namespace std; void *PrintHello(void *threadid) { int* tid; tid = (int*)threadid; for(int i = 0; i
8 2024-04-10
编程技术问答社区
我可以在pthread_detached线程上调用pthread_join吗?
我有从一个父螺纹产生的16个线程.我正在等待孩子在父母中致电pthread_join完成执行.但是,之后在每个孩子的线程中,我称为pthread_detach.我想知道父母是否仍会等待孩子完成执行.在"人页"页面中,它对PTHREAD_DETACH说:"当分离线程终止时,其资源为 自动释放回系统而无需 与终止线程一起连接的另一个线程." 解决方案 我可以在pthread_detached线程上调用pthread_join吗? no. 我想知道父母是否仍会等待孩子完成执行. 这是未定义的行为. 如果线程参数指定为pthread_join()的值不参考可加入线程. 独立线程不合格. 如果一个孩子线程在另一个线程试图加入时变为分离,那么您现在正在加入一个不可加入的线程. 您应该最多一次为每个线程调用pthread_join或pthread_detach .请勿将同时致电同一线程.
14 2024-04-10
编程技术问答社区
如何修复我的关于曼德布罗特集的Pthreads代码?
我有以下有关计算和创建Mandelbrot集的图片的Pthreads代码.我在C中的代码工作正常,并且可以很好地打印出结果图片.关键是使用以下代码,我能够编译代码并执行该代码.之后,如果我尝试查看GIMP中的结果.ppm文件,则根本无法打开它.我想我在代码中做错了什么.如果有人可以帮助我,我会很高兴. // mandpthread.c // to compile: gcc mandpthread.c -o mandpthread -lm -lrt -lpthread // usage: ./mandpthread > output.ppm #include #include #include #include #include #include typedef struct {
14 2024-04-10
编程技术问答社区
线程的MAP_PRIVATE和MAP_SHARED的区别
文件'Hello'的内容是hello. $ od -tx1 -tc hello 0000000 68 65 6c 6c 6f 0a h e l l o \n 0000006 以下是我的代码,是对文件" Hello"进行一些更改的代码. static void *task(); int main(void) { int *p; pthread_t Thread; int fd = open("hello", O_RDWR); if (fd
10 2024-04-10
编程技术问答社区
保护共享数据和共享同一堆栈
如何保护共享资源?需要确定哪种代码使用共享资源并保护它们.我猜测POP和PUSH资源是共享的.因此,为了保护他们,我会将这些功能放在保护标签下:就像有私人:公共:我还如何制作创建的200个线程共享相同的堆栈.更新:我的教授说,顶部是共享资源. /* * Stack containing race conditions */ #include #include #include // Linked list node typedef int value_t; typedef struct Node { value_t data; struct Node *next; } StackNode; // Stack function declarations void push(value_t v, StackNode **top); value_t pop(StackNode **top); int is_
12 2024-04-10
编程技术问答社区
C语言中的线程间通信
作为我项目的一部分,我必须使用线程修改数值集成算法. 这大致是在常规顺序方法中发生的. void Controller(struct DE) { //initialization step for(;;) //till the entire range has not been covered... { //compute the next time-point solution using the previously known solutions. NIiter(); //then check if the result is acceptable or not and take the necessary steps... } } 现在这就是我打算做的.... void Controller(struct DE) { //initialization step
8 2024-04-10
编程技术问答社区
如何在取消一个线程后杀死所有用pthread_create创建的子进程?
我有以下代码,并且在 myProgram 的主()代码的每个步骤中都会制作ps aux | grep myprogram(我构建的应用程序的名称). 在执行 myprogram 的执行时,ps aux | grep myprogram在列表中仅显示 myProgram 取消我在main()乞讨中创建的线程后,ps aux | grep myprogram显示 myProgram 两次,我希望只能获得1. 有人可以解释这种行为吗?以及如何返回最初情况(仅1个myprogram) #include #include #include pthread_t test_thread; void *thread_test_run (void *v) { int i=1; while(1) { printf("into thread %d\r\n",i); i+
8 2024-04-10
编程技术问答社区
带有结构指针的共享内存mutex
我正在寻找一些反馈,以了解我是否正确进行以下操作.我正在为大量使用命名Mutex的一些Windows实时代码移植一些Windows实时代码.它花了一些搜索,但我遇到了一些东西,说您可以使用SHM Open使用共享记忆作为Linux中的sutexes. 我不能在此处包含所有代码,但是我将需要一些回馈的关键领域汇总在一起.我的问题是我是否正确设置了共享存储器区域,并且是否正确设置了Mutex,以及是否正确设置了我的指针,以及如何将其用于锁定/解锁. volatile struct GenQ { volatile pthread_mutex_t *qMutexId volatile sem_t qSemId volatile int nexton volatile int nextoff } typedef struct Node{ void *qid char
12 2024-04-10
编程技术问答社区
为什么pthread_equal是线程安全的?
如果我查看pthread_equal的实现,则如下: int __pthread_equal (pthread_t thread1, pthread_t thread2) { return thread1 == thread2; } weak_alias (__pthread_equal, pthread_equal) typedef unsigned long int pthread_t; posix文档说pthread_equal是螺纹安全.但是调用pthread_equals副本,因此访问thread1和thread2变量.如果这些变量是全局的,并且在此刻通过另一个线程改变了,这将导致不确定的行为. 那么pthread_t应该不是原子吗?还是以其他方式确保了原子能行为? 解决方案 此实现pthread_equal(这将是特定于其所使用的POSIX实现),除了本地范围外,无法访问任何变量.在C中,论点始终按价值通过. thread1和thread2是
10 2024-04-10
编程技术问答社区
C: 如何安全、正确地给一个pthread传递多个参数?
考虑此简单代码: void* threadFunction(void* arg) { int argument=(int)arg; printf("%d recieved\n", argument); return NULL; } int main(int argv, char* argc[]) { int error; int i=0; pthread_t thread; int argument_to_thread=0; if ((error=pthread_create(&thread, NULL, threadFunction, (void*)argument_to_thread))!=0) { printf("Can't create thread: [%s]\n", strerror(error)); return 1; } pthread_
10 2024-04-10
编程技术问答社区