假设有一个简单的缓冲区,用作生产者和消费者线程之间某些数据的传输点。通过阅读周围的内容,我整理了以下内容:
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++ 中的多线程”文章值得推荐吗?
atomic
和
atomic
在这里就太过分了。毫无价值的是,在某些情况下它很有用,比如单例双重检查锁定。
mutex
代替
atomic::wait()
和 mutex
。