关于互斥的完成,无论什么操纵体系都离不开三个步骤
初始化互斥锁
锁操纵
解锁操纵
关于差别的体系只是完成的函数有一些差别罢了,然则功用实在都迥然差别,在锁操纵和解锁操纵的时刻大部份体系都有超时机制在内里,来保证不会一向锁在某个处所,我们为了框架简朴,没有设置超时,举行锁操纵的时刻假如得不到锁,将一向守候在那里。
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 信号量的内容,更多相关内容请关注ki4网(www.ki4.cn)!