条件变量condition_variable
wait()是condition_variable的成员函数
void wait (unique_lock& lck)会无条件的阻塞当前线程然后等待通知,前提是此时对象lck已经成功获取了锁。等待时会调用lck.unlock()释放锁,使其它线程可以获取锁。一旦得到通知(由其他线程显式地通知),函数就会释放阻塞并调用lck.lock(),使lck保持与调用函数时相同的状态。然后函数返回,注意,最后一次lck.lock()的调用可能会在返回前再次阻塞线程。
using namespace std;
class A {
private:
list<int> my_List;
mutex my_Mutex;
condition_variable my_Condition;
public:
void InMes() {
for (int i = 0;i < 100000;i++) {
unique_lock<mutex> myulock(my_Mutex);
my_List.push_back(i);
cout << "向列表中插入了元素:" << i << endl;
my_Condition.notify_all();
}
}
void OutMes() {
for(int i =0;i<100000;i++) {
unique_lock<mutex> myulock(my_Mutex);
while (my_List.empty()) {
my_Condition.wait(myulock);
}
my_List.pop_front();
cout << "从队列中弹出了第"<<i<<"个元素" << endl;
}
}
};
int main()
{
A* TestClass = new A();
thread myobj1(&A::InMes,TestClass);
thread myobj2(&A::OutMes,TestClass);
myobj1.join();
myobj2.join();
return 0;
}
wati()函数因为没有条件判断,因此有时候会产生虚假唤醒,而有条件的等待可以很好的解决这一问题。
void wait (unique_lock& lck, Predicate pred)为有条件的等待,pred是一个可调用的对象或函数,它不接受任何参数,并返回一个可以作为bool计算的值。当pred为false时wait()函数才会使线程等待,在收到其他线程通知时只有当pred返回true时才会被唤醒。我们将上述代码做如下修改,它的输出与上述一样。
wait_for(unique_lock,std::chrono)当前线程收到通知或指定时间超时前,都会一直阻塞