我遇到了一个奇怪的现象:我的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)上编译它们的情况。
答案 0 :(得分:1)
感谢您的所有答案和评论!
我找到了这个奇怪的分段错误的来源。
在代码的其他部分,我将浮动数加载到某些数组。
但是我错误地使用了malloc( sizeof(int) * length)
。以前,我
使用float
类型,因为float
和int
具有相同的大小,这个错误
没有出现在我早期版本的代码中。但最近,我更新了
从float
到double
的类型,这会导致这种奇怪的行为。
很抱歉放入与错误来源无关的代码。 我没想到这个bug会导致pthread的奇怪行为。
答案 1 :(得分:0)
我怀疑你正在溢出threads
数组。既然你没有显示声明的地方,我无法确定。通常,我在尝试调试分段错误时所做的第一件事就是启动gdb。 RMS写了一篇非常好的介绍,使用符号调试器来跟踪段错误。 GDB可以处理线程之间切换等奇特的东西,并且会在导致segfault的指令处停止,而无需手动设置断点。