我有以下代码,最初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,直到很久以后.
总结以上是内存溢出为你收集整理的c – 内存排序问题全部内容,希望文章能够帮你解决c – 内存排序问题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)