1.使用条件变量做线程同步的时候,使用while而不是if,是因为可能会出现假唤醒的情况,
while(!flag) {
cond.wait(lock);
}
2.notify_one会唤醒一个等待该变量的线程,若没有线程等待,则什么也不做,若有多个线程等待,无法确定会唤醒哪一个。
3.关于几种互斥量
mull_mutex
无任何锁定功能的“互斥量”,空对象模式是用。
mutex
独占式互斥量,最简单但最常用
timed_mutex
独占式互斥量,一段时间内试图锁定,若超时则返回false
recursive_mutex
递归式互斥量,可以多次锁定,相应的也要多次解锁
Recursive_timed_mutex
递归式互斥量,同样增加一段时间内试图锁定,若超时则返回false
Shared_mutex
多读者,单写者的共享互斥量(读写锁)
相应的常用成员函数:
void lock(); //锁定,否则阻塞
void unlock(); // 解锁
bool try_lock(); //尝试锁定,但不会阻塞
bool try_lock_for(const duration &rel_time); //timed_ 特有,阻塞一段时间后尝试锁定
bool try_lock_until(const time_point &t);// timed_ 特有,阻塞一段时间后尝试锁定
4.关于互斥量的几个常用辅助
(1)lock_guard()--Mute的优秀辅助
作用:此类辅助锁定互斥量,构造时锁定,析构时解锁,避免遗忘解锁,也就是说在其作用域内他会一直锁定要求的变量。
(2)unique_lock()--升级的lock_guard(),选项相对较多
unique_lock(Lockable & mu) ;//锁定
unique_lock(Lockable & mu,boost::adopt_lock_t);//不锁定,但会解锁
unique_lock(Lockable & mu,boost::defer_lock_t);//不锁定互斥量
unique_lock(Lockable & mu,boost::try_to_lock_t);//尝试锁定互斥量
unique_lock(Lockable & mu,const time_point &t);//超时锁定