mutex 直译为 互斥量。
使用它可以做到:一份共享数据, 同时只能由一个线程访问,在此基础上会衍生很多很方便的api,通过mutex将共享数据的访问变成互斥操作,避免与时间相关的错误
简单结论及定义:
1. 每个线程在对资源操作前都尝试先加锁,加锁成功才能操作,操作结束就解锁
2. 当A线程对某个全局变量加锁访问,B在访问前尝试加锁,拿不到锁,B阻塞。C线程不去加锁,而直接访问该全局变量,依然能够访问(这样数据就有点混乱了)
3. 如果一个互斥量当前没有被锁住,A线程将该互斥量锁住,解锁之前,A线程一直拥有该锁。
4. 如果一个互斥量已经被其他线程锁住了,则当前的调用它的线程被阻塞住。
5. 如果当前互斥量被当前调用线程锁住,则会产生死锁(deadlock)
接口:
C++11中提供了std::mutex互斥量,共包含四种类型:
std::mutex:最基本的mutex类。
std::recursive_mutex:递归mutex类,能多次锁定而不死锁。
std::time_mutex:定时mutex类,可以锁定一定的时间
std::recursive_timed_mutex:定时递归mutex类。
两种锁类型:
std::lock_guard:方便线程对互斥量上锁
std::unique_lock:方便线程对互斥量上锁,但提供了更好的上锁和解锁控制
相关的函数:
std::try_lock:尝试同时对多个互斥量上锁
std::lock:可以同时对多个互斥量上锁
std::call_once:如果多个线程需要同时调用某个函数,call_once可以保证多个线程对该函数只调用一次
标签:std,加锁,c++,互斥,线程,mutex,上锁 From: https://www.cnblogs.com/fxw1/p/16903825.html