使用printf()改变多线程结果?

时间:2014-03-24 13:05:50

标签: c++ c pthreads printf

我正在编写一个多线程程序来为类项目运行修改后的冒泡排序。基本上,每个线程气泡对整数数组的一个段进行排序,并且每个段与其相邻段共享一个元素,以便值在它们之间流动。目前,我在关键部分使用pthread_mutex_t个;但我必须有一些错误,因为有时它会完成排序,有时它会完成排序,有时程序会挂起。

这是我的问题:如果我使用printf()来查看我在每个帖子中的位置,那么它几乎可以保证挂起(这使得很难弄清楚它挂在哪里)。那么为什么在每个线程运行的代码的某些部分中使用printf()似乎会阻止挂起并导致程序完成?

编辑:我确定我的问题的主要原因是我没有正确初始化我的互斥锁(使用pthread_mutex_init())。所以chrk是正确的,我使用了不正确的同步,printf()使用减慢了一些事情,使它看起来像一些事情正在发挥作用。

2 个答案:

答案 0 :(得分:1)

我无法确定这一点,显然,只是说出我的猜测:

理论上,printf(3)使用系统调用write(2)stdout,这是一个I / O过程,因此比代码的其余部分(CPU计算)慢。因此,如果您有其他同步问题,printf()执行所花费的时间可能是偶然的"修复"这个问题的一些例子。

然而,这不是解决同步问题的正确方法,因此您必须再次检查代码以找到以错误方式解决的竞争条件。

答案 1 :(得分:0)

很久以前,我遇到过类似的问题。希望能帮助到你。我也有printk问题,我发现编译器正在优化我的代码并将我的循环转换为while(1);.

Strange behavior of printk in linux kernel module