【发布时间】:2014-03-24 13:05:49
【问题描述】:
我正在编写一个多线程程序来为班级项目运行修改后的冒泡排序。基本上,每个线程冒泡对整数数组的一个段进行排序,每个段与其相邻段共享一个元素,以便值在它们之间流动。目前,我在关键部分周围使用pthread_mutex_ts;但我一定有什么问题,因为有时它完成排序,有时它完成未排序,有时程序只是挂起。
这是我的问题:如果我使用printf()s 查看我在每个线程中的位置,几乎可以保证不会挂起(这很难弄清楚在它被挂断的地方)。那么为什么在每个线程运行的某些代码部分中使用printf()s 似乎可以防止挂起并导致程序结束呢?
编辑:我确定问题的主要原因是我没有正确初始化我的互斥锁(使用pthread_mutex_init())。所以chrk 是正确的,我使用了不正确的同步,而printf() 的使用使事情变慢了,以至于看起来有些事情正在工作。
【问题讨论】:
-
使用调试器而不是
printf()或发布一些代码,否则问题太宽泛了。包含更改的代码将允许程序运行的潜在原因有很多。 IMO 一些 UB。 -
没有代码,没有答案 - 但您可能会遇到某种竞争条件,在这种情况下添加任何代码行(例如 printf)都可以改变代码的时间。
-
@chux,我不熟悉“UB”(简短的谷歌搜索证明没有帮助)。我现在正在玩 gdb(试图学习如何使用它)。 @NiRR,这个问题更多的是试图找出
printf()是否有什么特别之处会导致这种情况(我知道该函数是“线程安全的”,所以我不知道这是否会影响“有趣”的方式)。 -
UB = 未定义的行为。
-
@chux,谢谢——我看错了,还以为你在建议一个名为 UB 的调试器;)