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);//超时锁定

posted on 2017-09-16 09:25  LyndonYoung  阅读(176)  评论(0)    收藏  举报