我正在尝试使用C 0x支持,有一个问题,我猜不应该在那里.或者我不明白主题或
gcc有错误.
我有以下代码,最初x和y相等.线程1始终先增加x,然后增加y.两者都是原子整数值,所以增量没有任何问题.线程2正在检查x是否小于y,如果是,则显示错误消息.
这段代码有时候会失败,但为什么?这里的问题可能是内存重新排序,但是所有原子操作默认情况下都是一致的,我没有明确放松这些操作.我在x86上编译这个代码,据我所知,应该不会有任何排序问题.你能解释一下问题吗?
#include <iostream> #include <atomic> #include <thread> std::atomic_int x; std::atomic_int y; void f1() { while (true) { ++x; ++y; } } void f2() { while (true) { if (x < y) { std::cout << "error" << std::endl; } } } int main() { x = 0; y = 0; std::thread t1(f1); std::thread t2(f2); t1.join(); t2.join(); }
结果可以看出here.
解决方法
问题可能在你的测试中:
if (x < y)
线程可以评估x,而不是随便评估y,直到很久以后.