文档章节

C++多线程框架-----Mutex互斥和Sem信号量

r
 ranjiewen
发布于 2016/11/03 23:48
字数 746
阅读 5
收藏 1

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

 
     互斥和信号量是多线程编程的两个基础,其原理就不详细说了,大家去看看操作系统的书或者网上查查吧。
对于互斥的实现,无论什么操作系统都离不开三个步骤
1.初始化互斥锁
2.锁操作
3.解锁操作
 
     对于不同的系统只是实现的函数有一些不同而已,但是功能其实都大同小异,在锁操作和解锁操作的时候大部分系统都有超时机制在里面,来保证不会一直锁在某个地方,我们为了框架简单,没有设置超时,进行锁操作的时候如果得不到锁,将一直等待在那里。
 
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.初始化信号量
2.发送信号量(信号量+1)
3.接收信号量(信号量-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
 
参考:http://blog.csdn.net/ygrx/article/details/8963784
 
 

本文转载自:http://www.cnblogs.com/ranjiewen/p/5734535.html

r
粉丝 1
博文 203
码字总数 28
作品 0
武汉
程序员
私信 提问
C++雾中风景12:聊聊C++中的Mutex,以及拯救生产力的Boost

笔者近期在工作之中编程实现一个Cache结构的封装,需要使用到C++之中的互斥量Mutex,于是花了一些时间进行了调研。(结果对C++标准库很是绝望....)最终还是通过利用了Boost库的shared_mute...

LeeHappen
2018/10/06
0
0
linux下生产者消费者 多线程演示程序

基本API介绍 线程 线程创建: int pthreadcreate(pthread *thread, pthreadattrt attr, void (*startroutine)(void), void arg); 第一个参数为指向线程 第二个参数用来设置线程属性。 第三个参...

西昆仑
2012/06/06
826
0
c++开发程序员面试拼多多面试题整理(含答案)

题很多,先上题后上答案,便于大家思考。 一.拼多多服务端实习岗位面试 1、 一个C++源文件从文本到可执行文件经历的过程 2、#include 的顺序以及尖叫括号和双引号的区别 3、进程和线程,为什...

程序员的1生
10/28
0
0
互斥量与信号量

互斥量(Mutex) 互斥量表现互斥现象的数据结构,也被当作二元信号灯。一个互斥基本上是一个多任务敏感的二元信号,它能用作同步多任务的行为,它常用作保护从中断来的临界段代码并且在共享同步...

雨中人X
2016/11/09
40
0
线程同步机制的区别与比较及进程通信方法

有关多线程的一些技术问题: 1、 何时使用多线程? 2、 线程如何同步? 3、 线程之间如何通讯? 4、 进程之间如何通讯? 先来回答第一个问题,线程实际主要应用于四个主要领域,当然各个领域...

AlphaJay
2010/06/02
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx反向代理+负载均衡+服务器宕机解决办法

反向代理 作用:保证系统安全,不暴露服务器IP,利用nginx服务器,利用内网ip进行访问,避免出现攻击服务器的情况 启动本地tomact,127.0.0.1:8080可以访问到tomcat管理页面 效果:通过 bbs....

Jack088
10分钟前
2
0
返回IEnumerable 与IQueryable相比 [关闭]

返回IQueryable<T>与IEnumerable<T>之间有什么区别? IQueryable<Customer> custs = from c in db.Customerswhere c.City == "<City>"select c;IEnumerable<Customer> custs = from c i......

技术盛宴
17分钟前
2
0
开放下载 | 《Knative 云原生应用开发指南》开启云原生时代 Serverless 之门

点击下载《Knative 云原生应用开发指南》 自 2018 年 Knative 项目开源后,就得到了广大开发者的密切关注。Knative 在 Kubernetes 之上提供了一套完整的应用 Serverless 编排服务,让应用开发...

阿里巴巴云原生
22分钟前
2
0
解密淘宝推荐实战,打造 “比你还懂你” 的个性化APP

手淘推荐简介 手淘推荐的快速发展源于2014年阿里“All in 无线”战略的提出。在无线时代,手机屏幕变小,用户无法同时浏览多个视窗,交互变得困难,在这样的情况下,手淘借助个性化推荐来提升...

阿里云官方博客
24分钟前
2
0
内核程序中进程的pid,handle,eprocess之间相互转换的方法

在内核程序开发中,我们常常需要取得某进程的pid或句柄,或者需要检索进程的eprocess结构,很多API函数需要的参数也不同,所以掌握pid<->handle<->eprocess相互转换的方法会大大提高我们的开...

simpower
26分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部