gpt4 book ai didi

c++ - notify_all 不唤醒等待线程

转载 作者:搜寻专家 更新时间:2023-10-31 02:13:55 29 4
gpt4 key购买 nike

DBThread::DBThread() : running_(false)
{

}

DBThread::~DBThread()
{
if (thread_)
{
thread_->join();
}
}

void DBThread::Init()
{
thread_ = std::make_shared<std::thread>(std::bind(&DBThread::Run, this));
std::unique_lock<std::mutex> lock(mutex_);
cv_.wait(lock, [&] {return running_; });
std::cout << "Init success";
}

void DBThread::AddTask(std::shared_ptr<Delegate> task)
{
std::lock_guard<std::mutex> lock(mutex_);
task_queue_.push(task);
}

void DBThread::Run()
{
running_ = true;
cv_.notify_all();
while (true)
{
std::unique_lock<std::mutex> lock(mutex_);
cv_.wait(lock, [&] {return !task_queue_.empty(); });
std::cout << "run task" << std::endl;
}
}

我有两个线程,我们将其命名为 A 和 B,A 调用 Init 并等待 B 完全初始化,即使 running_ 为真,A 有时也会挂起等待。知道为什么会发生这种情况。我们将不胜感激。

最佳答案

std::condition_variable::wait(lock, pred)

基本相同
while (!pred()) {
wait(lock);
}

如果线程将 running_ 设置为 true 并在检查谓词期间调用 notify_all(),但在调用 wait 之前,那么这个通知就会丢失,wait会一直等到另一个通知到来。最简单的修复方法是:

void DBThread::Run()
{
std::unique_lock<std::mutex> lock(mutex_);
running_ = true;
cv_.notify_all();
while (true)
{
cv_.wait(lock, [&] {return !task_queue_.empty(); });
std::cout << "run task" << std::endl;
}
}

关于c++ - notify_all 不唤醒等待线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40614368/

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