c – 内存排序问题
发布时间:2020-12-16 05:47:48 所属栏目:百科 来源:网络整理
导读:我正在尝试使用C 0x支持,有一个问题,我猜不应该在那里.或者我不明白主题或 gcc有错误. 我有以下代码,最初x和y相等.线程1始终先增加x,然后增加y.两者都是原子整数值,所以增量没有任何问题.线程2正在检查x是否小于y,如果是,则显示错误消息. 这段代码有时候会失
我正在尝试使用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,直到很久以后. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |