首页 > 解决方案 > 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()in 的waitingForWork工作原理。https://en.cppreference.com/w/cpp/thread/condition_variable/wait指出

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

*1) 原子地解锁锁,阻塞当前正在执行的线程,并将其添加到等待这个的线程列表中。执行 notify_all() 或 notify_one() 时,线程将被解除阻塞。它也可能被虚假地解除阻塞。解除阻塞时,无论什么原因,都会重新获取锁并等待退出。如果此函数因异常退出,也会重新获取锁。(直到 C++14)

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

如果wait()解锁锁,这如何阻塞线程?解锁不会有反效果吗?

标签: c++multithreadingconditional-statements

解决方案


推荐阅读