1 多线程
1.1 c++11多线程相关的头文件
c++11新标准中引入了四个头文件来支持多线程编程,他们分别是,,,<condition_variable>和
1.2 Mutex系列类
std::mutex, 最基本的mutex类
std::recursive_mutex,递归mutex类
std::time_mutex,定时mutex类
std::recursive_timed_mutex,定时递归mutex类
1.3 Lock类
std::lock_guard,与mutex RAII相关,方便线程对互斥量上锁
std::unique_lock,与mutex RAII相关,方便线程对互斥量上锁,但提供了更好的上锁和解锁控制。
std::try_lock,尝试同时对多个互斥量上锁
std::lock,可以同时对多个互斥量上锁
std::call_once,如果多个线程需要同时调用某个函数,call_once可以保证多个线程对给函数只调用一次。
1.4 使用
如果第一次运行了lock()这个方法,而没有运行unlock()这个方法,第二次再运行lock()这个方法时,程序就会卡停在这里。而std::lock_guard()就是用来替代lock和unlock。一般可以将需要保护的代码用一个大括号括起来,然后在大括号括起来的第一行代码定义std::lock_guard()。当进入这个作用域时,构造std::lock_guard()对象,在std::lock_guard()的构造函数中其实是执行了lock()这个方法,当退出这个作用域的时候,std::lock_guard()对象将会被析构,而在std::lock_guard()的析构函数中实际是调用了unlock()。
1.5 std::condition_variable
用于多线程之间的通信,它可以阻塞一个或同时阻塞多个线程。std::condition_variable需要与std::unique_lock配合使用。
当std::condition_variable对象的某个wait函数被调用的时候,他使用std::unique_lock来锁住当前线程。当前线程会一直被阻塞,当另外一个线程在相同的
std::condition_variable对象上调用了notification函数来唤醒当前线程
notify_one:唤醒某个wait线程,如果当前没有等待线程,则该函数什么也不做;如果同时存在多个等待线程,则唤醒某个线程是不确定的