首页 > 编程知识 正文

形象解释互斥信号量mutex(二值信号量和互斥信号量)

时间:2023-05-03 12:55:41 阅读:66050 作者:2275

文章目录1 .互斥量概述2. thread库7种互斥量3 .示例代码14 .示例代码25 .示例代码3

C Boost库:概述和第一个示例程序

C Boost库:数值转换lexical_cast

C Boost库:字符串格式格式格式

C Boost库:字符串string_algo

C Boost库:字符串算法string_algo

C Boost库:类型派生BOOST_AUTO/BOOST_TYPEOF

C Boost库:分词处理库tokenizer

C Boost库:在windows上编译Boost库

C Boost库:日期和时间库date_time

C Boost库:智能指针scoped_ptr

C Boost库:数组智能指针scoped_array

C Boost库:共享所有权的智能指针shared_ptr

C Boost库:工厂函数make_shared

C Boost库:具有共享权限的数组智能指针shared_array

C Boost库:弱引用智能指针weak_ptr

C Boost库:禁止复制nocopyable

C Boost库:计时器timer

C Boost库:常规数组阵列

C Boost库:哈希容器unordered_set、unordered_multiset

C Boost库:哈希容器unordered_map、unordered_multimap

C Boost库:双向映射容器bimap

C Boost库:环形缓冲区circular_buffer

C Boost库:动态多维数组multi_array

C Boost库:使用property_tree分析XML和JSON

C Boost库:简化循环的BOOST_FOREACH

C Boost库:随机数库Random

C Boost库:引用库ref

C Boost库:绑定库bind

C Boost库:线程库thread跨平台多线程

C Boost库:互斥量mutex

1 .互斥量轮廓互斥量(Mutex )是一种线程同步手段,用于通过多线程编程防止多个线程同时操作共享资源(或关键节),当一个线程锁定互斥量时,捷克线程

Windows和Linux中创建互斥量的函数不同。

平台windowslinuxcreatemutex (pthread _ mutex _ init ) )销毁closehandle (pthread _ mutex _ destroy ) )锁定的waitforsinion

mutex :或try_mutex排他量; 最简单最常见的互斥类型timed_mutex :互斥量,但提供超时锁定功能。 recursive_mutex或recursive_try_mutex :递归独占量,可多次锁定,需要多次解锁; recursive _ time _ mutex :与recursive _ mutex一致,提供超时; shared _ mutex:multiple-reader/single-writer型共享互斥量(读/写锁定)3.示例代码1 # include boost/thread.hpusingnamesppp //命名空间# includeiostreamusingnamespacestd; #pragmacomment(lib,' libboost _ thread-VC 100-mt-GD-x32-1 _ 67.lib ' ) /多个售票窗口同时售票,总票数为100张inted //定义互斥量mutexmutex m的void SellA () while(true )//this _ thread 33603360 sleep (POSIX _ time 33603360 milliseconds ) 10 ) m.lock (; //保护共享资源同一时间,只有一个线程访问if(tickets0) (在printf ) a窗口中)销售第d张票证! n ',tickets; //A,b同时进入--tickets; } m.unlock (; if(Tickets=0) break; }}void SellB () while(true )/this_thread3360:sleep ) POSIX _ time 3360: milliseconds (10 ) ); m.lock (; 在if(Tickets0) printf ) b窗口中销售第%d张票! n ',tickets; --tickets; }m.unlock (; if(Tickets=0) break; }}int main () (Threadta ) (Sella ); //A线程立即运行threadtb(sellb ); //B线程立即运行ta.join (; //等待线程结束的tb.join (; //等线程结束,cout '票卖完了!' endl; getchar (; 返回0; }执行结果:

4 .示例代码2 # include boost/thread.hppusingnamespaceboost; //命名空间# includeiostreamusingnamespacestd; #pragmacomment(lib,' libboost _ thread-VC 100-mt-GD-x32-1 _ 67.lib ' )//try_mutex m; //try_mutex等效于typedef mutex try_mutex; //超时返回的mutextimed_mutex tmu; void ThreadFun1() {tmu.lock ); printf(threadfun1已锁定8秒钟! n '; this _ thread :3360 sleep (POSIX _ time :3360 seconds (8) ); tmu.unlock (; printf(threadfun1解锁! n '; } voidthreadfun2((如果尝试锁定//mutex且其他线程已锁定,则最多阻止3秒钟,然后执行0 this _ thread 33603360 sleep (POSIX _ time 336033660 slep 尝试printf(threadfun2封锁! n '; bool block=tmu.try _ lock _ for (chrono :3360 seconds (3); 在第//3秒,线程1保持锁定,因此线程2无法锁定,0//bool block=tmu.try _ lock _ for (chrono :3360 seconds ) (10 ) ) 在//10秒,线程1已被解锁,因此线程2可以解除锁定并返回1cout 'ThreadFun2以确认解锁是否成功: ' bLock endl; tmu.unlock (; }int main () threadt1 ) threadfun1); threadT2(threadfun2; t1.join (; t2.join (; cout '线程执行结束! ' endl; getchar (; 返回0; }执行结果:

5 .示例代码3 # include boost/thread.hppusingnamespaceboost; //命名空间# includeiostreamusingnamespacestd; #pragmacomment(lib,' libboost _ thread-VC 100-mt-GD-x32-1 _ 67.lib ' )//mutex m; //常规mutex锁定两次后为recursive_mutex m; //递归mutex可以多次锁定以防止死锁,相应地多次void ThreadFun1(() ) {m.lock; //首次上锁cout 'ThreadFun1首次上锁!' endl; m.lock (;//第二次解锁cout 'ThreadFun1第一次解锁!' endl; m.unlock (; cout 'ThreadFun1首次解锁!' endl; this _ thread :3360 sleep (POSIX _ time :3360 seconds (8) ); //睡眠8秒后第二次解锁m.unlock (; cout 'ThreadFun1的第二次解锁!' endl; } voidthreadfun2((this _ thread 3360: sleep ) POSIX_time3360:seconds(1); //确保在线程1之后运行bool b=m.try_lock (); //不阻止锁定,锁定成功为1,锁定失败为0cout 'ThreadFun2锁定成功与否:' b endl; m.unlock (; }同时运行}int main (()//threadt1 ) threadfun1); threadT2(threadfun2; t1.join (; t2.join (; cout '线程执行已结束!' endl; getchar (; 返回0; }执行结果:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。