C ++ std :: conditional_variable :: wait

问题描述

// conditionVariable.cpp

#include <iostream>
#include <condition_variable>
#include <mutex>
#include <thread>

std::mutex mutex_;
std::condition_variable condVar;

bool dataReady{false};

void doTheWork(){
  std::cout << "Processing shared data." << std::endl;
}

void waitingForWork(){
    std::cout << "Worker: Waiting for work." << std::endl;
    std::unique_lock<std::mutex> lck(mutex_);
    condVar.wait(lck,[]{ return dataReady; });
    doTheWork();
    std::cout << "Work done." << std::endl;
}

void setDataReady(){
    {
      std::lock_guard<std::mutex> lck(mutex_);
      dataReady = true;
    }
    std::cout << "Sender: Data is ready."  << std::endl;
    condVar.notify_one();
}

int main(){

  std::cout << std::endl;

  std::thread t1(waitingForWork);
  std::thread t2(setDataReady);

  t1.join();
  t2.join();

  std::cout << std::endl;
  
}

我无法理解std::conditional_variable::wait()中的waitingForWork的工作方式。 https://en.cppreference.com/w/cpp/thread/condition_variable/wait声明

wait导致当前线程阻塞,直到通知了条件变量或发生虚假唤醒为止,有选择地循环直到满足某些谓词为止。

* 1)以原子方式解锁锁,阻塞当前正在执行的线程,并将其添加到等待 this的线程列表中。执行notify_all()或notify_one()时,该线程将被解除阻塞。它也可能会被虚假地阻止。解除阻止后,无论出于何种原因,都将重新获得锁定并等待退出。如果此函数通过异常退出,则也将重新获得锁定。 (直到C ++ 14)

“以原子方式解锁”是什么意思?它会解锁mutex_,从而允许t2获取它并用lock_guard锁定它吗?

如果wait()解除了锁定,这将如何阻塞线程?解锁是否具有相反的阻止效果

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)