我正在编写一个多线程程序来为类项目运行修改后的冒泡排序。基本上,每个线程气泡对整数数组的一个段进行排序,并且每个段与其相邻段共享一个元素,以便值在它们之间流动。目前,我在关键部分使用pthread_mutex_t
个;但我必须有一些错误,因为有时它会完成排序,有时它会完成排序,有时程序会挂起。
这是我的问题:如果我使用printf()
来查看我在每个帖子中的位置,那么它几乎可以保证不挂起(这使得很难弄清楚它挂在哪里)。那么为什么在每个线程运行的代码的某些部分中使用printf()
似乎会阻止挂起并导致程序完成?
编辑:我确定我的问题的主要原因是我没有正确初始化我的互斥锁(使用pthread_mutex_init()
)。所以chrk是正确的,我使用了不正确的同步,printf()
使用减慢了一些事情,使它看起来像一些事情正在发挥作用。
答案 0 :(得分:1)
我无法确定这一点,显然,只是说出我的猜测:
理论上,printf(3)
使用系统调用write(2)
到stdout
,这是一个I / O过程,因此比代码的其余部分(CPU计算)慢。因此,如果您有其他同步问题,printf()
执行所花费的时间可能是偶然的"修复"这个问题的一些例子。
然而,这不是解决同步问题的正确方法,因此您必须再次检查代码以找到以错误方式解决的竞争条件。
答案 1 :(得分:0)
很久以前,我遇到过类似的问题。希望能帮助到你。我也有printk问题,我发现编译器正在优化我的代码并将我的循环转换为while(1);.