“std::atomic<>”对于“std::condition_variable”来说是必要的还是过度的?

问题描述 投票:0回答:1

假设有一个简单的缓冲区,用作生产者和消费者线程之间某些数据的传输点。通过阅读周围的内容,我整理了以下内容:

const std::chrono::time_point<std::chrono::steady_clock> _TIMEOUT;
std::condition_variable _waitForData;
std::mutex _hasDataMutex;
std::atomic<bool> _hasData;

void blocking_read(){
    std::unique_lock<std::mutex> lock(_hasDataMutex);
    if (!_hasData) {
        _waitForData.wait_until(lock, _TIMEOUT,
                           [&]() -> bool { return _hasData; });
    }
}

void put_data(char* buf) {
    //...write data into local buffer
    std::unique_lock<std::mutex> lock(_hasDataMutex);
    _hasData = true;
}

假设变量已正确初始化:声明

_hasData
是否有必要,或者相反,是多余的?或者如果我使用
atomic
,是否可以在没有互斥体的情况下逃脱?
有免费的“C++ 中的多线程”文章值得推荐吗?

c++ multithreading condition-variable stdatomic
1个回答
0
投票
    同时使用
  1. atomic

    atomic
    在这里就太过分了。毫无价值的是,在某些情况下它很有用,比如单例双重检查锁定。
    
    

  2. 您可以使用
  3. mutex

    代替

    atomic::wait()
    mutex
    
    

© www.soinside.com 2019 - 2024. All rights reserved.