C++ 多线程框架 (2):Mutex 互斥和 Sem 信号量

互斥和信号量是多线程编程的两个基础,其原理就不详细说了,大家去看看操作系统的书或者网上查查吧。

对于互斥的实现,无论什么操作系统都离不开三个步骤

初始化互斥锁

锁操作

解锁操作

立即学习“C++免费学习笔记(深入)”;

对于不同的系统只是实现的函数有一些不同而已,但是功能其实都大同小异,在锁操作和解锁操作的时候大部分系统都有超时机制在里面,来保证不会一直锁在某个地方,我们为了框架简单,没有设置超时,进行锁操作的时候如果得不到锁,将一直等待在那里。

Mutex的基类我们描述如下

class CMutex  {      public:          CMutex(const char *pName = NULL);  //初始化锁          ~CMutex();          virtual bool Lock()=0;       //锁操作,纯虚函数          virtual bool UnLock()=0;  //解锁操作,纯虚函数          const char * getName(void) const {                  return mutex_name;              }      protected:          char       *mutex_name;  //锁名字  };

对于每个系统的实现,都需要完成初始化,锁操作,解锁操作三个部分,在linux下,这三个操作都很简单,就不在这里贴代码了。

同样,对于信号量Sem,每个系统的实现也大同小异,无非就是

初始化信号量

发送信号量(信号量+1)

接收信号量(信号量-1)

Sem基类描述如下

class CCountingSem  {      public:          typedef enum {                   kTimeout,               kForever              }Mode;                              CCountingSem();     //初始化信号量          ~CCountingSem();           virtual bool Get() = 0;  //接收信号量               virtual bool  Post(void) = 0;   //发送信号量  };

同样,具体实现就不贴代码了。

当然,对于一个满足设计模式的系统,新建互斥锁和信号量的时候当然不能直接new这些类啦,必然还要通过简单工程来返回,在COperatingSystemFactory类中添加newMutex和newCountingSem方法,通过COperatingSystemFactory对操作系统的判断来返回相应的实体。

class COperatingSystemFactory  {      public:          static COperatingSystem *newOperatingSystem();          static CCountingSem  *newCountingSem(unsigned int init=0); //参数是信号量的初始值,一般为0          static CMutex   *newMutex(const char *pName=NULL);  };

好了,有了互斥和信号量,怎么用呢,在main函数中,我们可以先申请好互斥锁和信号量,如果我们启了很多线程,如果某几个之间需要互斥锁,那我们将申请好的互斥锁赋值给相应的线程,就可以直接使用了。至于各个线程类,是你自己写的,只是继承自CThread而已,里面的成员变量怎么和main中申请的互斥锁关联,这就不用说了吧,你把它设置成public赋值也行,设置从private用函数set也行,一切看你啦。

有了互斥锁和信号量,下面就可以起消息队列了,有了消息队列,一个最简单的多线程模型也就完成了。

github地址:

https://github.com/wyh267/Cplusplus_Thread_Lib

以上就是C++ 多线程框架 (2):Mutex 互斥Sem 信号量的内容,更多相关内容请关注PHP中文网(www.php.cn)!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1432088.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 06:11:55
下一篇 2025年12月17日 06:12:00

相关推荐

发表回复

登录后才能评论
关注微信