c - 多线程 C 代码在编译器优化下会崩溃,如果没有编译器优化,则可以完美运行,这是预期会发生的情况,还是肯定是一个错误?

标签 c multithreading optimization thread-safety

我有一个网络程序,其中涉及多个交互线程和一个用于重叠网络 I/O 的线程池。我正在使用 MinGW 进行编译,它是 Windows 的 gcc。

在没有编译器优化的情况下,它可以在多台不同的机器上 100% 正常工作,但是当我打开优化时,它就会崩溃。

这种情况是否应该发生,或者这是否揭示了我需要修复的错误?

最佳答案

最可能的解释是它揭示了您需要修复的错误。这很可能是线程中的竞争条件,但也可能是别名冲突。

一个可以帮助您定位问题的技巧,尤其是在您轻松复制问题的情况下,是进行二分搜索来查找受影响的文件。基本上,编译一半经过优化的文件,一半不经过优化的文件。查看代码是否有效或崩溃。这会将问题定位到一半的代码。重复此过程,缩小有问题的文件范围,直到将其本地化为文件。如果需要,将该文件分成两部分,并将代码从一个文件移动到另一个文件,以找出优化时失败的代码块,而不是未优化时失败的代码块。

关于c - 多线程 C 代码在编译器优化下会崩溃,如果没有编译器优化,则可以完美运行,这是预期会发生的情况,还是肯定是一个错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10221339/

相关文章:

c - 访问 C linux 中 fork 之前创建的子进程中的字符串数组

c++ - 多线程和 MFC

java - super.run() 调用后,Thread 类中的控制不会返回

performance - 通过矢量化符号优化程序

c# - 试试{}捕获优化?

c - Pthreads 堆栈优先级

c - 如何在eclipse中重新编译包含文件

c - glibc 检测到 *** free() : invalid pointer

python - 我正在尝试为基于文本的应用程序创建 tkinter 输出窗口

java - 什么更有效率?存储变量引用与不存储变量引用(Android 中的上下文)