0

我正在使用 g++ 编译器研究无锁结构。似乎使用 -o1 开关,g++ 会改变我的代码的执行顺序。如何禁止 g++ 对代码的某些部分进行优化,同时保持对其他部分的优化?我知道我可以将它拆分为两个文件并将它们链接起来,但它看起来很难看。

4

2 回答 2

3

您可以使用函数属性“__attribute__ ((optimize 0))”来设置单个函数的优化,或者使用“#pragma GCC optimize”来设置代码块。不过,我认为这些仅适用于 GCC 4.4 - 请查看您的 GCC 手册。如果它们不受支持,那么分离源是您唯一的选择。

不过,我还要说,如果您的代码在启用优化的情况下失败,那么您的代码很可能是错误的,尤其是当您尝试做一些从根本上非常困难的事情时。处理器可能会对您的代码执行重新排序(在顺序一致性的限制内),因此您使用 GCC 获得的任何重新排序都可能发生。

于 2008-11-22T08:01:56.523 回答
3

如果你发现 gcc 改变了代码中的执行顺序,你应该考虑使用内存屏障。只是不要假设 volatile 变量会保护您免受该问题的影响。他们只会确保在单个线程中,行为是语言所保证的,并且将始终从其内存位置读取变量以解释对执行代码“不可见”的更改。(例如,信号处理程序对变量所做的更改)。

GCC 从 4.2 版开始支持 OpenMP。您可以使用它来创建带有特殊#pragma指令的内存屏障。

Herb Sutter 和 Andrei Alexandrescu 编写的 PDF 是关于锁定免费代码的一个很好的见解:C++ 和双重检查锁定的风险

于 2008-11-22T19:03:59.730 回答