最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

c++ mutex 每日消息

来源:博客园

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可以保证多个线程对该函数只调用一次

关键词: