C++条件变量wait方法的误区

查看GitHub上的ThreadPool时发现以前理解上的一个误区。

wait的重载

C++条件变量用于等待的相关方法waitwait_forwait_until存在一个重载参数Predicate pred

1
2
template< class Predicate >
void wait( std::unique_lock<std::mutex>& lock, Predicate pred );

cppreference对其的说明:

wait 导致当前线程阻塞直至条件变量被通知,或虚假唤醒发生。可以提供 pred 以检测虚假唤醒。

上面的重载等价于:

1
2
while (!pred())
    wait(lock);

因此如果开始等待时,pred已经为真,即使不唤醒也会立刻退出等待。

我之前以为这个条件只会在唤醒时才检查一次,也就是必须在唤醒后,同时满足该条件,才会退出等待。

虽然对于二者的不同理解写出来的程序逻辑一般都差不多,但是可能会误导作者对满足pred条件的等待导致的阻塞进行特殊处理。

感想

C++细节真多啊,基础不牢,地动山摇,还须勤加学习。

引用