作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有这样的代码:
std::queue<myData*> _qDatas;
std::mutex _qDatasMtx;
生成器函数
void generator_thread()
{
std::this_thread::sleep_for(std::chrono::milliseconds(1));
{
std::lock_guard<std::mutex> lck(_qDatasMtx);
_qData.push(new myData);
}
//std::lock_guard<std::mutex> lck(cvMtx); //need lock here?
cv.notify_one();
}
消费者函数
void consumer_thread()
{
for(;;)
{
std::unique_lock lck(_qDatasMtx);
if(_qDatas.size() > 0)
{
delete _qDatas.front();
_qDatas.pop();
}
else
cv.wait(lck);
}
}
所以如果我有几十个生成器线程和一个消费者线程,在每个线程中调用 cv.notify_one() 时是否需要互斥锁?
std::condition_variable 是线程安全的吗?
最佳答案
do I need a
mutex
lock when callingcv.notify_one()
in each thread?
没有
is
std::condition_variable
thread-safe?
是
当调用 wait
时,您传递了一个锁定的 mutex
,它会立即解锁以供使用。调用 notify
时,您不会使用相同的 mutex
锁定它,因为会发生什么(链接上有详细说明):
execute notify_one or notify_all on the std::condition_variable (the lock does not need to be held for notification)
来自std::condition_variable::notify_all
:
The notifying thread does not need to hold the lock on the same mutex as the one held by the waiting thread(s);
关于您的代码片段:
//std::lock_guard<std::mutex> lck(cvMtx); //need lock here?
cv.notify_one();
不,你不需要锁。
关于c++ - std::condition_variable 是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46822450/
我是一名优秀的程序员,十分优秀!