其他分享
首页 > 其他分享> > c – cppreference上错误的std :: condition_variable示例?

c – cppreference上错误的std :: condition_variable示例?

作者:互联网

在他们example使用的std :: condition_variable中,他们基本上有

std::mutex m;
std::condition_variable cv;
bool ready = false;

void worker_thread()
{
    // Wait until main() sends data
    std::unique_lock<std::mutex> lk(m);
    cv.wait(lk, []{return ready;});
    // more ...
}

int main()
{
    std::thread worker(worker_thread);

    data = "Example data";
    // send data to the worker thread
    {
        std::lock_guard<std::mutex> lk(m);
        ready = true;
    }
    cv.notify_one();
    // more...
}

我现在的问题是变量就绪,它没有被声明为std :: atomic *.

如果发生虚假唤醒,为什么不引入竞争条件?

解决方法:

不,没有竞争条件.
即使条件变量虚假唤醒,它也必须重新获得锁定.因此,有两件事情发生:

>锁定时,没有线程可以触摸就绪,因为锁可以保护它.
>通过重新获取锁,必须同步布尔值,因为锁执行内存顺序获取,这导致准备好具有最新值.

因此,竞争条件无法发生.

标签:c,c11,multithreading,race-condition
来源: https://codeday.me/bug/20190828/1749726.html