在这里删除c volatile是否安全?

在这里删除c volatile是否安全?,第1张

概述从m_flag的定义中删除volatile是否安全? 如果m_flag不是volatile,那么什么会阻止编译器优化掉这个循环的条件:while(!m_flag)m_cv.wait(lock); ? 标准(后C 11)是否明确规定在这种情况下禁止这种优化? #include <mutex>#include <condition_variable>#include <future>#inclu 从m_flag的定义中删除volatile是否安全?
如果m_flag不是volatile,那么什么会阻止编译器优化掉这个循环的条件:while(!m_flag)m_cv.wait(lock); ?
标准(后C 11)是否明确规定在这种情况下禁止这种优化?
#include <mutex>#include <condition_variable>#include <future>#include <iostream>using namespace std;class foofoo{    volatile bool m_flag;    mutex m_mutex;    condition_variable m_cv;public:    voID DoWork()    {        m_flag = false;        unique_lock<mutex> lock(m_mutex);        auto junk = async(std::launch::async,[this]()        {            {                unique_lock<mutex> lock(m_mutex);                m_flag = true;            }            m_cv.notify_one();        });        while (!m_flag) m_cv.wait(lock);        cout << "ququ" << endl;    }};int main(){    foofoo f;    f.DoWork();}
解决方法 通常,volatile和多线程在C 11中是正交的.使用volatile既不会添加也不会删除数据争用.

在这种情况下,m_flag = true;在async([intro.execution] / p14)启动的线程中释放互斥锁之前,它被排序,后者又与m_cv.wait(lock)中的互斥锁的后续获取同步([thread.mutex.requirements. mutex] / p11,25),然后在随后读取m_flag之前对其进行排序. m_flag = true;因此,线程发生在之后的读取之前,因此发生在后续读取之前. ([intro.multithread] / p13-14)

由于m_flag没有其他副作用,m_flag = true;是读取的可见副作用([intro.multithread] / p15),因此读取必须读取可见副作用所存储的内容,即为真.

无论是否使用volatile,“优化”该条件的编译器都是不符合的.

总结

以上是内存溢出为你收集整理的在这里删除c volatile是否安全?全部内容,希望文章能够帮你解决在这里删除c volatile是否安全?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1254789.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存