[c++] 条件变量、虚假唤醒

1.条件变量

使用条件变量的目的是实现多个线程间的同步操作。条件不满足时,相关线程会一直被阻塞。

条件变量的本质是一个线程间共享的全局变量。

通常包括两个操作:线程等待条件变量成立而挂起、另一个线程使条件变量成立而唤醒被阻塞的线程。

条件变量使用总是和一个互斥锁相结合。通常是mutex。并且使用unique_lock<mutex>的RAII类模板管理。

等待条件成立,使用condition_variable类成员wait、wait_for、wait_until

设置信号成立,使用condition_variable类成员notify_one、notify_all

2.使用unique_lock或lock_guard来管理条件变量的互斥锁

lock_guard的获取锁和释放锁只能在构造和析构时进行,而unique_lock则更加灵活,可以在需要时进行lock、try_lock、unlock。

unique_lock和lock_guard的wait和notify型的类成员函数可以进行线程阻塞和唤醒。

3.虚假唤醒

正常情况下,wait型函数应当在线程被唤醒或者超时后才返回。但实际中由于操作系统的原因,可能导致wait函数在不满足条件时也返回(即虚假唤醒)。

虚假唤醒的原因,是多核处理器下,pthread_cond_signal可能会激活不止一个线程。

通俗的解释:消费线程收到了其他线程(生产)传来的唤醒信号,但是唤醒后发现别的消费线程处理的更快,此时没有数据被可以用于操作,这种情况的发生是预期之外的,称之为虚假唤醒。

为了避免这种情况,可以使用带谓词的wait函数。即使用while语句进行解决。即若被唤醒后没有可以执行的操作,就继续休眠。

posted @ 2022-04-06 09:20  Cheung-10  阅读(240)  评论(0)    收藏  举报