当使用某些特定数量的线程时,Pthread不起作用

时间:2013-12-31 17:08:26

标签: c multithreading pthreads

我遇到了一个奇怪的现象:我的C程序在某些特定数量的线程上不起作用,例如: 8。

当我使用“fprintf”进行调试时,我发现在创建pthreads时会出现问题:

298 /* work for each thread */
299 void* work(void *t)
300 {
301   long tid;
302   tid = (long)t;
303   fprintf(stderr, "In thread %lu\n", tid);
304
...
368   pthread_exit((void*)t);
369 }

513 /* main function */
514 int my_main(struct Params params)
515 {
...
      pthread_t* threads;
      threads = malloc(threads_num * sizeof(pthread_t));
574   long t;
575   int rc;
576   for (t=0; t<threads_num; t++)
577   {
578     fprintf(stderr, "create %lu\n", t);
579     rc = pthread_create(&threads[t], NULL, work, (void*)t);
580     if(rc)
581     {
582       printf("ERROR: return code from pthread_creat() is %d\n", rc);
583       exit(-1);
584     }
585   }
...
599   for(t=0; t<threads_num; t++)
600     pthread_join(threads[t], NULL);
...
615   return 0;
616 }

结果如下:

create 0
create 1
create 2
create 3
create 4
create 5
In thread 0
In thread 3
In thread 4
create 6
In thread 1
In thread 2
In thread 5
create 7
In thread 6
Segmentation fault

线程7可能会出现什么问题?有什么想法吗?

其他信息可能有用:代码在我的MacBook Pro上运行良好,GCC作为编译器。 这里的问题是我在一些使用GCC的Linux服务器(openSUSE)上编译它们的情况。

2 个答案:

答案 0 :(得分:1)

感谢您的所有答案和评论!

我找到了这个奇怪的分段错误的来源。

在代码的其他部分,我将浮动数加载到某些数组。 但是我错误地使用了malloc( sizeof(int) * length)。以前,我 使用float类型,因为floatint具有相同的大小,这个错误 没有出现在我早期版本的代码中。但最近,我更新了 从floatdouble的类型,这会导致这种奇怪的行为。

很抱歉放入与错误来源无关的代码。 我没想到这个bug会导致pthread的奇怪行为。

答案 1 :(得分:0)

我怀疑你正在溢出threads数组。既然你没有显示声明的地方,我无法确定。通常,我在尝试调试分段错误时所做的第一件事就是启动gdb。 RMS写了一篇非常好的介绍,使用符号调试器来跟踪段错误。 GDB可以处理线程之间切换等奇特的东西,并且会在导致segfault的指令处停止,而无需手动设置断点。