我正在使用g ++编译器开发无锁结构。似乎用-o1开关,g ++将改变我的代码的执行顺序。如何在保持优化到其他部分的同时禁止g ++对代码的某些部分进行优化?我知道我可以将它分成两个文件并链接它们,但它看起来很难看。
答案 0 :(得分:3)
您可以使用函数属性“__attribute __((optimize 0))”来设置单个函数的优化,或者使用“#pragma GCC optimize”来代码块。这些仅适用于GCC 4.4,但我认为 - 请查看您的GCC手册。如果不支持,则分离源是您唯一的选择。
我还会说,如果您的代码在启用优化时失败,则很可能是您的代码错误,尤其是当您尝试执行基本上非常困难的操作时。处理器可能会对您的代码执行重新排序(在顺序一致性的限制范围内),因此无论如何,您可能会对GCC进行任何重新排序。
答案 1 :(得分:3)
如果您发现gcc更改了代码中的执行顺序,则应考虑使用内存屏障。只是不要认为volatile变量会保护您免受该问题的影响。它们只会确保在单个线程中,行为是语言所保证的,并且将始终从其内存位置读取变量,以说明对执行代码“不可见”的更改。 (例如,由信号处理程序完成的变量的更改)。
自4.2版以来,GCC支持OpenMP。您可以使用它来创建具有特殊#pragma
指令的内存屏障。
关于锁定免费代码的非常好的见解是Herb Sutter和Andrei Alexandrescu撰写的PDF:C++ and the Perils of Double-Checked Locking