互斥和信号量是多线程编程的两个基础,其原理就不详细说了,大家去看看操作系统的书或者网上查查吧。
对于互斥的实现,无论什么操作系统都离不开三个步骤
1.初始化互斥锁
2.锁操作
3.解锁操作
 
     对于不同的系统只是实现的函数有一些不同而已,但是功能其实都大同小异,在锁操作和解锁操作的时候大部分系统都有超时机制在里面,来保证不会一直锁在某个地方,我们为了框架简单,没有设置超时,进行锁操作的时候如果得不到锁,将一直等待在那里。
 
Mutex的基类我们描述如下
class CMutex
{
public:
CMutex(const char *pName = NULL); //初始化锁
~CMutex();
virtual bool Lock()=; //锁操作,纯虚函数
virtual bool UnLock()=; //解锁操作,纯虚函数
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() = ; //接收信号量
virtual bool Post(void) = ; //发送信号量
};
同样,具体实现就不贴代码了。
当然,对于一个满足设计模式的系统,新建互斥锁和信号量的时候当然不能直接new这些类啦,必然还要通过简单工程来返回,在COperatingSystemFactory类中添加newMutex和newCountingSem方法,通过COperatingSystemFactory对操作系统的判断来返回相应的实体。


class COperatingSystemFactory
{
public:
static COperatingSystem *newOperatingSystem();
static CCountingSem *newCountingSem(unsigned int init=); //参数是信号量的初始值,一般为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
 
 

C++多线程框架-----Mutex互斥和Sem信号量的更多相关文章

  1. php Pthread 多线程 (三) Mutex 互斥量

    当我们用多线程操作同一个资源时,在同一时间内只能有一个线程能够对资源进行操作,这时就需要用到互斥量了.比如我们对同一个文件进行读写操作时. <?php class Add extends Thr ...

  2. 多线程(三)多线程同步_基本介绍及mutex互斥体

    同步进制的引入为了解决以下三个主要问题:1.控制多个线程之间对共享资源访问,保证共享资源的完整性例如:线程A对共享资源进行写入,线程B读取共享资源2.确保多个线程之间的动作以指定的次序发生例如:线程B ...

  3. linux 线程的同步 一 (互斥量和信号量)

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

  4. 【Linux C 多线程编程】互斥锁与条件变量

    一.互斥锁 互斥量从本质上说就是一把锁, 提供对共享资源的保护访问. 1) 初始化: 在Linux下, 线程的互斥量数据类型是pthread_mutex_t. 在使用前, 要对它进行初始化: 对于静态 ...

  5. 1.linux系统基础笔记(互斥量、信号量)

    操作系统是很多人每天必须打交道的东西,因为在你打开电脑的一刹那,随着bios自检结束,你的windows系统已经开始运行了.如果问大家操作系统是什么?可能有的人会说操作系统就是windows,就是那些 ...

  6. Linux并发与同步专题 (4) Mutex互斥量

    关键词:mutex.MCS.OSQ. <Linux并发与同步专题 (1)原子操作和内存屏障> <Linux并发与同步专题 (2)spinlock> <Linux并发与同步 ...

  7. C#多线程学习(六) 互斥对象

    如何控制好多个线程相互之间的联系,不产生冲突和重复,这需要用到互斥对象,即:System.Threading 命名空间中的 Mutex 类. 我们可以把Mutex看作一个出租车,乘客看作线程.乘客首先 ...

  8. RWLock——一种细粒度的Mutex互斥锁

    RWMutex -- 细粒度的读写锁 我们之前有讲过 Mutex 互斥锁.这是在任何时刻下只允许一个 goroutine 执行的串行化的锁.而现在这个 RWMutex 就是在 Mutex 的基础上进行 ...

  9. c/c++ 多线程 绕过mutex的保护

    多线程 绕过mutex的保护 mutex,能够解决线程安全的问题,但它不是万能的.下面的例子虽然使用了mutex,但是恶意注入了一个外部函数,导致把被mutex保护的双向链表,让一个外部的指针指向了, ...

随机推荐

  1. kafka.network.SocketServer分析

    当Kafka启动时,会启动这个SocketServer来接收客户端的连接,处理客户端请求,发送响应. 这个类的注释说明了这个socket server的结构 /** * An NIO socket s ...

  2. jquery中事件重复绑定以及解绑问题

    一般的情况下,对于这种情况,我们常规的思路是,先解绑,再绑定,如下: $(selector).unbind('click').bind('click',function(){....}); 当这样会有 ...

  3. inflate方法与findViewById的区别

    LayoutInflater作用是将layout的xml布局文件实例化为View类对象. 对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来找 re ...

  4. Eclipse反编译工具Jad及插件JadClipse配置(转)

    Eclipse反编译工具Jad及插件JadClipse配置 Jad是一个Java的一个反编译工具,是用命令行执行,和通常JDK自带的java,javac命令是一样的.不过因为是控制台运行,所以用起来不 ...

  5. 使用PHP处理POST上传时$_FILES数组为何为空

    在做一个简单的表单上传测试时,服务端的php脚本中,$_FILES数组为空;这样就不能获取从浏览器上传的信息.什么原因呢? 通过Google,找到下面这个web: php上传文件$_FILES数组为空 ...

  6. Weak Event Patterns

    https://msdn.microsoft.com/en-US/library/aa970850(v=vs.100).aspx In applications, it is possible tha ...

  7. oracle时间加减的语句写法

    FROM: http://soft.doit.com.cn/article/2012/0105/2850851.shtml --加法 --加1年  SELECT SYSDATE,ADD_MONTHS( ...

  8. eclipse不自动弹出提示(Alt+/ 快捷键失效)

    转自:http://www.cnblogs.com/shaweng/archive/2013/09/26/3340016.html 主要有一下几种方法:    1.次方法用于没有一点提示的情况:依次打 ...

  9. Compass被墙后如何安装安装

    今天安装 Compass 多时候发现竟然安装不了,且什么提示也没有,让人纳闷.安装代码如下: $ gem install compass 运行该段代码后发现没反应,也没有提示,后来网上查了才知道,竟然 ...

  10. Codeforces Round #221 (Div. 2) Lever I.O.U.

    这场cf 做的很差,,第一题犯了一个很低级的错误..把i写成了J.... 第二题 想的太复杂了...其实我们只需要 考虑每个人自己的负债情况就行了,就是假设每个人把别人 欠他的钱,拿过来还给别人..这 ...