`
阿尔萨斯
  • 浏览: 4193004 次
社区版块
存档分类
最新评论

QNX多线程同步之Semaphore

 
阅读更多

之前讲了QNX上Mutex的使用,Mutex作用是锁住一个资源,保证同一时间只有一个线程可以使用该资源。不过,有些情况下Mutex不能满足需求,比如某个资源可以允许两个线程同时访问,但是不允许超过两个线程访问它。这种情况下如果还是使用Mutex的话只有一个线程可以访问该资源,没有充分利用允许两个线程访问的属性。Semaphore就适合这种情况,Semaphore翻译成“信号灯”,主要是通过信号灯的数量控制访问资源的线程数。

下面通过一个形象一点的例子说明Semaphore的使用。

假设有3个连队的士兵要通过一座桥,不过这座桥同时只能有两个人通过,有三个人通过的话就会垮掉。士兵们知道了桥的情况,所以在连队内做了规定,士兵们排队通过,只有前面的士兵通过桥之后,排在后面的一个士兵才能上桥。

不过连队内的规定并不能解决问题,虽然3个连队的士兵都按连队内的规定逐个通过,但是连队之间没有协定,3个连队的第一个士兵都走上了桥,桥就垮了。因此,需要在连队之间再做一个协定(这就是多线程同步了)。

就假设军队里有个厉害的工兵,在桥上安装了个信号灯装置(就是Semaphore了),桥头有个按钮,桥尾有个按钮,桥头的按钮按一下桥上就亮起一盏灯,桥尾的按钮按一下桥上就灭一盏灯。

有了这个装置,剩下的就是给连队下规定了,规定每个连队派人上桥之前要确定桥上的灯不能亮两盏(当然也不能是两盏以上)。如果两盏灯都是亮的,必须等待到有灯灭了才可以上桥。同时,士兵上桥之前要按一下桥头的按钮,下桥的时候要按一下桥尾的按钮。

这样,3个连队的士兵都可以安全过桥了,前提是大家都按规定使用信号灯。

另外,如果桥加固了,可以允许4个人同时通过,只需要规定亮的灯是4盏以下才可以上桥。这就是信号灯的数量。

好,回到代码实现上。

首先,如果要使用Semaphore的话,需要引入semaphore.h头文件:

#include <semaphore.h>

然后需要定义一个全局的sem_t变量:

sem_t sem;

然后需要在使用Sempaphore之前对它进行初始化工作,调用的是sem_init方法,第一个参数是定义的sem_t变量,第二个参数先不理,给个0就好了,第三个参数是信号灯的数量,如上例的话就是2(同时只允许2个人通过),代码如下:

sem_init( &sem, 0, 2);

等待信号灯的方法是sem_wait,参数是定义的sem_t变量。注意这个方法包括了上面示例的几个动作,一个是上桥要看信号灯是不是亮了两盏,是的话就等待,不是的话就按一下桥头的按钮,然后上桥。

sem_wait(&sem);

按灭信号灯的方法是sem_post,参数也是定义的sem_t变量:

sem_post(&sem);

完整代码附在后面。其中的onBridge变量用于记录桥上有几个人在走,纯粹是为了说明信号灯使用的效果,不是Semaphore使用所需要的。而主线程的工作就是启动3个线程调用semFunction1方法,模拟3个连队,启动所有子线程后是一个死循环,不断查看onBridge变量,如果onBridge变量大于2则报警。当然,使用了Semaphore之后,onBridge变量是不会大于2的。同学们可以将sem_wait和sem_post注释掉看看没有使用Semaphore的效果。

#include <stdlib.h>

#include <stdio.h>

#include <pthread.h>

#include <semaphore.h>

sem_t sem;

int onBridge=0;

void* semFunction1(void* arg) {

int i=0;

for (i=0;i<20;i++)

{

printf("waiting a sem \n");

sem_wait(&sem);

printf("one soldier walking through the bridge\n");

onBridge++;

sleep(1);

printf("one soldier left the bridge\n");

onBridge--;

printf("posting a sem \n");

sem_post(&sem);

}

return 0;

}

int main(int argc, char *argv[]) {

printf("Starting Semaphore Test\n");

sem_init( &sem, 0, 2);

pthread_create( NULL, NULL, &semFunction1, NULL );

pthread_create( NULL, NULL, &semFunction1, NULL );

pthread_create( NULL, NULL, &semFunction1, NULL );

while(1)

{

if (onBridge>2)

{

printf("%d people on the bridge,the bridge is falling down.\n",onBridge);

}

else

{

printf("%d people on the bridge,it is save.\n",onBridge);

}

delay(200);

}

return 0;

return EXIT_SUCCESS;

}

分享到:
评论

相关推荐

    qnx多线程编程

    工业控制上非常流行的实时操作系统,在pc104上有非常广泛的应用

    qnx下多线程开发实例

    qnx嵌入式操作系统多线程开发,类似于Linux多线程开发,只是一些属性设置有点区别。

    QNX环境下多线程编程

    绍了QNX实时操作系统和多线程编程技术,包括线程间同步的方法、多线程程序的分析步骤、线程基本程序结构以及实用编译方法。

    QNX下的多线程编程

    介绍了QNX实时操作系统和多线程编程技术,包括线程间同步的方法、多线程程序的分析步骤、线程基本程序结构以及实用编译方法

    QNX环境下多线程编程.pdf

    QNX环境下多线程编程.pdfQNX环境下多线程编程.pdf

    QNX环境下多线程数据采集

    主要是qnx环境下的多线程编程,很有研究价值。国内很少有qnx的资料

    嵌入式系统/ARM技术中的QNX环境下多线程编程

    作者Email: zoutom@163.com 摘要:介绍了QNX实时操作系统和多线程编程技术,包括线程间同步的方法、多线程程序的分析步骤、线程基本程序结构以及实用编译方法。 关键词:QNX;多线程;同步;程序结构 0引言: QNX是由...

    QNX-Momentics.rar_QNX Momentics_qnx_qnx gf

    GF (Graphics Framework) 是QNX出的,与Photon完全不同的一套图形系统。现在的QNX,基本上有三种(四种?)图形开发用的环境可选 。

    QNX快速入门指南

    安装和配置QNX Momentics 工具和QNX Neutrino 操作系统,然后开发程序。 1 要求 2 安装QNX Momentics 开发包 3 安装 QNX Neutrino 实时操作系统 4 与QNX Neutrino联网 5 创建工程 6 与QNX Neutrino 联网 7 编译和...

    QNX的串口通信

    使用QNX Momentics IDE 4.7开发的qnx串口通信程序,与linux的串口还是有点不同的

    利用QNX screen接口共享屏幕显示图像

    1.QNX screen系统是一个图形框架,提供开发时图像显示功能,抽象对外统一接口,屏蔽底层硬件差异。本资源利用screen图形接口,读取显示设备的显示内容,并将其以窗口形式同步显示,并用thread实时读取原窗口变化。...

    Qnx 官方开发手册

    Qnx 开发手册 Library Reference,from Qnx Software System LTD.

    如何在qnx上获取进程内存_如何在qnx上获取进程内存_

    如何在qnx上获取进程内存,上传了一份文档,说明如何获取内存

    QNX系统常用命令.7z

    QNX系统常用命令,参考QNX7.0帮助文档和QNX工具手册,经过在板子上验证。文档包含QNX系统介绍,SHELL命令解释器,QNX常用命令使用说明。

    QNX系统中添加自己编译的.so库.zip_QNX .so文件_SO打包_qnx文件_qnx系统g++编译_so库

    将自己编译生成的动态链接库文件打包到QNX系统中,主要修改的是打包所依赖的build配置文件

    QNX操作系统安装指南.docx

    QNX操作系统安装指南 裸机安装QNX 安装准备: QNX6.5.0安装光盘; PC裸机配置要求:普通PC即可,硬盘至少8G。 安装步骤: 开机按Delete键,进入BIOS设置,在高级设置"Advanced Mode"中,将SATA模式设置为IDE,IDE...

    QNX 源代码,用于学习

    QNX 源代码,仅仅参考学习用。 想了解更深入的可以阅读代码,QNX 源代码让你更了解设计架构。

    Qt 4.7.1 for QNX systems

    文档描述了为了可以使Qt程序运行在QNX系统中如何在宿主机(windows、QNX、linux)以及在目标机(QNX 6.5.0 )中搭建Qt 4.7.1开发环境;文档为英文文档;需要开发者提前自备解压在目标机压缩包qt_qnx_targets.tar.gz...

Global site tag (gtag.js) - Google Analytics