gpt4 book ai didi

c++ - std::condition_variable 是线程安全的吗?

转载 作者:太空狗 更新时间:2023-10-29 19:51:22 24 4
gpt4 key购买 nike

我有这样的代码:

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 calling cv.notify_one() in each thread?

没有

is std::condition_variable thread-safe?


当调用 wait 时,您传递了一个锁定的 mutex,它会立即解锁以供使用。调用 notify 时,您不会使用相同的 mutex 锁定它,因为会发生什么(链接上有详细说明):

  1. 通知
  2. 正在等待的唤醒线程
  3. 锁定互斥量以供使用

来自 std::condition_variable :

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com