【发布时间】:2012-11-08 00:38:38
【问题描述】:
我正在使用 POSIX 线程,并且在我的程序结束时,我正在等待加入每个线程。经过一段时间的完美运行后,当我等待线程时,我的代码开始返回一个奇怪的错误。
pthreads threads[C+P];
for(i = 0; i < (C+P); i++)
{
printf("%d\n", i);
pthread_join(threads[i]);
}
如果我删除了 printf 语句,或者将其替换为任何其他 printf 语句、延迟或对 i 的任何其他操作,我仍然会遇到段错误。
我将如何开始调试?
【问题讨论】:
-
我会在程序段错误时使用
gdb获取堆栈跟踪。 -
知道线程[] 在哪里,它包含什么(我假设 pthread_t 值),我在堆栈中相对于它的位置(奇怪的是我知道,但你的问题也是如此)以及 C+P 如何与线程[] 的大小相关联可能会有所帮助。就目前而言,唯一可以获取更少信息的方法是,如果您从 sn-p 中省略了 for 循环。我们不知道threads[]是动态数组(
pthread_t *threads;),还是固定数组(pthread_t threads[N];)等等。你能给我们一块更大的骨头吗? -
猜测一下,您的代码中的其他地方存在某种竞争条件。
printf(),是每次调用都会刷新的控制台 I/O,速度很慢,并且会掩盖这种情况。 -
millimoose:如果是这种情况,我希望延迟也能解决问题。 WhozCraig:除了最近的编辑,我真的不知道还能给你什么。我正在尝试弄清楚如何使用 gdb 来解决这个问题,但我并不精通。
-
edit 替换为 fflush 具有相同的效果。你是对的,我在其他地方发现了一个竞争条件。
标签: c linux for-loop segmentation-fault printf