您的位置:首页 > 数据 >
如何使用lock_guard锁定mutex?java中mutex的使用方法 每日观点
来源:CSDN 2023-01-13 10:51:28

mutex用来协助采取独占方式控制对资源的并发访问,这里的资源可能是一个对象,或多个对象的组合,为了获得独占式的资源访问能力,相应的线程必须锁定mutex,这样可以防止其它线程也锁定该mutex。


【资料图】

下面两条线程如果没有使用mutex来同步,则输出结果会是112233。

mutex g_mutex;void print123() {g_mutex.lock();for (int i = 0; i < 3; i++) {this_thread::sleep_for(chrono::milliseconds(100));cout << i + 1;}g_mutex.unlock();} int main(){thread(print123).detach();thread(print123).detach();//123123system("pause");}

你应该确保mutex对象调用lock后,即使发生异常也会调用unlock,否则有可能造成资源被永远锁住或者死锁。

为此我们可以使用lock_guard来进行lock和unlock,lock_guard在构造时会lock,析构时会unlock,使用大括号对可以加快lock_guard的析构,需要注意的是lock_guard一定要分配变量名,否则不会有效果。

void print123(){lock_guard lockGuard(g_mutex);for (int i = 0; i < 3; i++) {this_thread::sleep_for(chrono::milliseconds(100));cout << i + 1;}}

同一线程多次锁定mutex会导致程序终止,而recursive_mutex则不会,这个mutex允许同一线程多次锁定。

recursive_mutex g_mutex;void print123(){g_mutex.lock();g_mutex.lock();for (int i = 0; i < 3; i++) {this_thread::sleep_for(chrono::milliseconds(100));cout << i + 1;}g_mutex.unlock();g_mutex.unlock();}

有时候线程想要锁定mutex,但又不想其它线程已锁定mutex时阻塞,这种情况下可以使用try_lock,它试图锁定mutex,成功就返回true,失败返回false。

为了等待特定长度的时间,你可以使用timed_mutex或recursive_timed_mutex的try_lock_for或try_lock_until方法。

由于try_lock在返回true时会锁定mutex,为了防止lock_guard重复锁定,需要传递参数adopt_lock。

void print123() {if (g_mutex.try_lock()) {lock_guard  lockGuard(g_mutex,adopt_lock);for (int i = 0; i < 3; i++) {this_thread::sleep_for(chrono::milliseconds(100));cout << i + 1;}} else {cout << "mutex locked" <thread(print123).detach();thread(print123).detach();system("pause");}

通常一个线程一次只锁定一个mutex,然而有时候必须锁定多个mutex,如果一个个锁定,有可能出现锁定了第一个mutex,而无法锁定第二个mutex的情况。这种情况下可以使用全局函数lock锁定多个mutex。

mutex g_mutex1;mutex g_mutex2;void print123() {lock(g_mutex1, g_mutex2);lock_guard lockGuard1(g_mutex1, adopt_lock);lock_guard lockGuard2(g_mutex2, adopt_lock);for (int i = 0; i < 3; i++) {this_thread::sleep_for(chrono::milliseconds(100));cout << i + 1;}} int main(){thread(print123).detach();thread(print123).detach();system("pause");}

使用全局函数try_lock尝试锁定多个mutex,如果锁定所有mutex则返回-1,否则返回第一个失败的mutex的索引(从0开始),并且所有被成功lock的mutex会又被unlock。

mutex g_mutex1;mutex g_mutex2;void print123() {lock(g_mutex1, g_mutex2);lock_guard lockGuard1(g_mutex1, adopt_lock);lock_guard lockGuard2(g_mutex2, adopt_lock);for (int i = 0; i < 3; i++) {this_thread::sleep_for(chrono::milliseconds(100));cout << i + 1;}}void printLockState(){auto result = try_lock(g_mutex1, g_mutex2);cout << result << endl;if (result == -1) {lock_guard lockGuard1(g_mutex1, adopt_lock);lock_guard lockGuard2(g_mutex2, adopt_lock);}} int main(){thread(print123).detach();thread(printLockState).detach();system("pause");}

除了lock_guard,C++还提供一个类似的类unique_lock,它比lock_guard更灵活,unique_lock允许你明确指定何时锁定或解锁mutex,而lock_guard总是锁定mutex,如果unique_lock析构时mutex仍被锁住,析构函数会自动调用unlock,如果没有则不做任何事。

mutex g_mutex1;timed_mutex g_mutex2; int main(){//尝试锁定mutex,但不会阻塞unique_lock uniqueLock1(g_mutex1, try_to_lock);//尝试锁定mutex,不超过10秒unique_lock uniqueLock2(g_mutex2, chrono::seconds(10));//主动调用lock,try_lock,try_lock_for等才会锁定unique_lock uniqueLock3(g_mutex1, defer_lock);//通过已锁定的mutex初始化unique_lock uniqueLock4(g_mutex1, adopt_lock);//判断有没有锁定mutexcout << (uniqueLock1 ? "locked" : "unlocked")<< endl;cout << uniqueLock1.owns_lock() << endl;//解锁mutexuniqueLock1.unlock();//锁定mutexuniqueLock3.lock();system("pause");}
关键词:
相关文章
2022年榆林市原煤产量为5.82亿吨 增长5.4%_当前热议

2022年榆林市原煤产量为5.82亿吨 增长5.4%_当前热议

  新年伊始,位于陕西省榆林市的煤炭生产企业开足马力、加紧生产,释放煤炭产能,多措并举保障煤炭运输,持续做好能源稳定保供工作。  作更多

2023-01-13 10:04:22
12月第五周云南省煤炭价格环比小幅上涨_世界快资讯

12月第五周云南省煤炭价格环比小幅上涨_世界快资讯

  据商务部重要生产资料市场监测系统显示,上周(2022年12月26日-2023年1月1日),云南省煤炭均价为15219元吨,环比上涨19%。其中,炼焦煤均更多

2023-01-13 10:05:35
12月第五周福建省煤炭市场价格稳中上涨 环球聚看点

12月第五周福建省煤炭市场价格稳中上涨 环球聚看点

  根据商务部重要生产资料监测系统监测数据显示,上周(2022年12月26日-2023年1月1日)福建省监测样本企业的煤炭市场价格平均为163856元吨,更多

2023-01-13 10:03:07
1月份第一周天津市煤炭价格环比持平|世界视点

1月份第一周天津市煤炭价格环比持平|世界视点

  据天津市市场运行监测数据显示,1月份第一周(1月2日-1月8日),天津市煤炭均价为734元吨,环比持平。上周煤炭核心驱动来自于国内疫情对生更多

2023-01-13 10:13:05
当前速看:焦煤:春节期间暂稳 后期压力渐增

当前速看:焦煤:春节期间暂稳 后期压力渐增

  临近春节,随着部分煤矿放假逐渐增多,钢厂和焦化厂焦煤补库接近尾声,叠加焦炭市场两轮降价,焦煤市场略显疲弱。因部分需求仍在,春节期更多

2023-01-13 10:17:03
山西焦化通过环保B级企业认定

山西焦化通过环保B级企业认定

  2022年以来,山西焦化多措并举推动环保工作落实落细。日前,该公司通过山西省环保厅的B级企业认定。  山西焦化成立环境监控中心,通过提更多

2023-01-13 09:07:14
平煤股份发行可转债获证监会审核通过_每日头条

平煤股份发行可转债获证监会审核通过_每日头条

  1月10日,平煤股份公告称,1月9日中国证监会第十八届发审委2023年第4次工作会议对公司公开发行可转换公司债券的申请进行了审核。根据会议更多

2023-01-13 09:01:14
12月中煤能源商品煤产量同比下降13.6% 销量下降19.2%

12月中煤能源商品煤产量同比下降13.6% 销量下降19.2%

  中煤能源1月11日发布的公告显示,2022年12月份,中煤能源商品煤产量为885万吨,同比下降136%,而上月为下降9%;环比减少33万吨,下降36%。更多

2023-01-13 09:12:54
环球快看点丨2023年山西力争煤炭产量达到13.65亿吨

环球快看点丨2023年山西力争煤炭产量达到13.65亿吨

  1月12日,山西省第十四届人民代表大会第一次会议开幕,山西省人民政府代省长金湘军作政府工作报告时讲到,2023年,山西将以制造业振兴为重更多

2023-01-13 08:57:13
解读:2022年12月份CPI同比涨幅略有扩大 PPI同比降幅有所收窄

解读:2022年12月份CPI同比涨幅略有扩大 PPI同比

  国家统计局今天发布了2022年12月份全国CPI(居民消费价格指数)和PPI(工业生产者出厂价格指数)数据。对此,国家统计局城市司首席统计师更多

2023-01-12 15:08:24