【问题标题】:Using printf() changes multithreaded outcome?使用 printf() 改变多线程结果?
【发布时间】: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 的调试器;)

标签: c++ c pthreads printf


【解决方案1】:

显然,我不能确定,只是说我的猜测:

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

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

【讨论】:

  • 谢谢,这似乎解决了问题的核心,即printf() 是否有什么特别之处可以解释这种行为。所以也许这没什么“特别”,只是时间问题——这就是我想确认的。
  • 此外,多线程感知库倾向于同步每个 FILE* 句柄的所有输入/输出。
【解决方案2】:

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

Strange behavior of printk in linux kernel module

【讨论】:

  • 这真的很吸引人;但是,如果这是问题所在,我难道不希望我的程序每次都挂起而不是某些时候吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多