std::condition_variable::wait()

std::condition_variable::wait()使用记录:

std::condition_variable::wait()有两个重载函数:

unconditional (1)
void wait (unique_lock& lck);
predicate (2)
template 
  void wait (unique_lock& lck, Predicate pred);

第一种形式只有一个参数unique_lock&,调用wait时,若参数互斥量lck被锁定,则wait会阻塞。

第二种形式除了unique_lock&参数外,第二个参数pred,即函数指针。当函数运行到该wait()函数时,若互斥量lck被锁定(?存疑),或者pred()返回值为false,满足两个条件之一,则wait阻塞。其等同于下面的形式:

while (!pred()) wait(lck);

何时激活线程:

对于第一种形式void wait (unique_lock& lck);

只要其它线程调用notify_one()或者notify_all()函数,wait()就会结束阻塞。

对于第二种形式,除了需要调用其它线程调用notify_one()或者notify_all()函数外,还需要pred()为true才会解除阻塞。

很显然,先设置pred()为true再调用任一notify函数,wait ( lck, pred)函数是可以结束阻塞的。假如先调用了notify函数,再将pred()置为true,这样wait (lck,  pred)会结束阻塞吗,通过下面的验证,是可以的。

#include 
#include 
#include 
#include 
#include 

std::mutex mutex;
std::condition_variable cond;
bool value = false;

void fun(int a)
{
    int b=0;
    std::unique_lock lock(mutex);
    while(!value)
    {
        std::cout << "thread wait before\n";
        cond.wait(lock, [](){std::cout << "pred\n"; return value;});
        b=888;
        std::cout << "thread wait after\n";
    }
    std::cout << "thread number = " << a << " value = " << value << " b = " << b << " line = " << __LINE__ << std::endl;
}
 
int main()
{
 
    std::thread th;
    th = std::thread(fun, 999);
 
    std::this_thread::sleep_for(std::chrono::seconds(1));//防止主线程先锁定mutex
    {
        std::unique_lock lock(mutex);
 
        std::this_thread::sleep_for(std::chrono::seconds(1));
        cond.notify_one();
        std::this_thread::sleep_for(std::chrono::seconds(1));
        std::cout << "after notify_one(), value = " << value <调用notify函数后,wait先去获取锁是否释放,若锁被释放接着去判断pred()是否为true,等pred()为true时则解除阻塞。

你可能感兴趣的:(c/c++,c++11)