Condition Variables Explained

Condition Variables Explained

Condition Variables

条件变量是一种用于在若干个线程之间发送信号的事件,一个或者多个线程可以等待其他线程发出信号。条件变量在C++11的头文件是:

1
#include <condition_variable>

条件变量往往与锁一起工作。

How things actually work with condition variable,

  • 线程1调用条件变量的wait,改变量在内部获取互斥锁并检查是否满足所需条件;
  • 如果不满足。则释放锁并等待条件变量发出信号,此时现场阻塞。条件变量的wait函数以原子的方式提供这两个操作;
  • 如果条件满足,线程2会向条件变量发出信号;
  • 一旦条件变量发出信号,正在等待它的线程1恢复,获取互斥锁,并检查是否实际满足与条件变量相关的条件,或者它是否是上级调用。如果有多个线程在等待,那么notify_one()将只解除阻塞一个线程;
  • 如果它是一个上级调用,那么它再次调用wait()函数;

Main member functions for std::condition_variable are

Wait()

该函数使得当前线程阻塞,直到条件变量发出信号或者发生虚假唤醒。

其以原子方式释放附属的的互斥锁,阻塞当前线程,并将其添加到等待当前条件变量对象的线程列表中。当某个线程在相同的条件变量对象上调用notify_one()或notify_all()时,该线程将被解除阻塞。

回调作为参数传递给该函数,回调将被调用以检查它是否属于虚假调用或真的满足条件。

当线程解锁时,wait()函数重新获取互斥锁并检查是否满足实际条件。如果不满足条件,则再次以原子方式释放附加的互斥锁,阻塞当前线程,并将其添加到等待当前条件变量对象的线程列表中。

notify_one()

如果存在线程正在等待相同的条件变量对象,则notify_one将解除其中一个等待线程的阻塞。

notify_all()

如果存在线程正在等待相同的条件变量对象,则notify_all将解除阻塞所有等待的线程。