繁体   English   中英

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

[英]Wrong std::condition_variable example on cppreference?

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...
}

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

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

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

  1. 锁定时,没有任何线程可以触摸ready ,因为锁可以保护它。
  2. 通过重新获取锁,布尔值必须同步,因为锁执行内存顺序获取,这导致ready具有最新值。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM