QNX多线程同步之Barrier(屏障)
之前和大家介绍过QNX上的线程同步方法metux和semophore,通过这两种方法可以对一个或者几个资源进行加锁,避免资源使用上的冲突。在另一种情况下,某个线程需要在其它线程完成工作后才继续执行,这时就需要使用到线程同步方法barrier。
举个现实的例子,假设有三个士兵在操作一门高炮,一个负责装填炮弹,一个负责调整高炮左右方向,一个负责调整高炮角度。很明显高炮需要在三名士兵完成任务后才能发射,否则要么打不准,要么炮弹根本打不出去。
一种解决方法是给高炮设置三个按钮,只有三个按钮都按下了高炮才发射,这样不管哪个士兵完成任务了,他只需要按下自己负责的按钮,一旦三个按钮都按下,说明三个士兵的工作都完成了,就发射炮弹。
这个有三个按钮的装置就可以说是一个屏障,保证高炮可以正常工作。
下面就以这个例子做一个barrier测试。
首先需要引入头文件,包括:
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <sync.h>
#include <sched.h>
#include <unistd.h>
其中pthread.h和sync.h是关键,一个用于线程创建,一个用于barrier。
然后定义一个pthread_barrier_t全局变量:
pthread_barrier_t barrier;
接着在main函数里初始化barrier:
pthread_barrier_init(&barrier, NULL, 3);
其中第一个参数就是barrier变量,第三个参数是屏障需要等待的数量,本例就是等待3个士兵完成任务,所以设置成3.
然后启动三个士兵的线程,每个士兵线程负责完成一件工作,完成之前有一个delay的循环,表示完成工作需要的时间,不同士兵线程delay的时间不同,表示完成不同工作需要不同的时间。
所有士兵线程完成工作后都调用pthread_barrier_wait方法,通知barrier工作以完成,并开始等待,调用方法如下,唯一的参数就是初始化好的barrier变量:
pthread_barrier_wait(&barrier);
一旦 pthread_barrier_wait执行完成,表示所用工作都完成了,就发射炮弹,通过打印“Fire!”表示。
printf("SoldierX:::::::::: Fire! \n");
另外,主线程启动三个士兵线程后进入一个循环等待,同时输出一些时间信息。
程序执行结果如下:
Entering Barrier Test
creating the barrier
creating the threads
Soldier1:::::::::: Adjusting angle
Soldier2:::::::::: Adjusting direction
Soldier3:::::::::: Filling bullet
timer in main thread:0
timer in main thread:1
timer in main thread:2
timer in main thread:3
timer in main thread:4
Soldier1:::::::::: angle ready!
timer in main thread:5
Soldier2:::::::::: direction ready!
timer in main thread:6
timer in main thread:7
Soldier3:::::::::: bullet ready!
Soldier3:::::::::: Fire!
Soldier1:::::::::: Fire!
Soldier2:::::::::: Fire!
timer in main thread:8
timer in main thread:9
end of main thread
可以看到,只有三个线程都完成相应任务后他们才继续往下执行,保证了大炮可以成功发射。
完整代码如下:
- #include <stdlib.h>
- #include <stdio.h>
- #include <pthread.h>
- #include <sync.h>
- #include <sched.h>
- #include <unistd.h>
- pthread_barrier_t barrier;
- void soldier1() {
- printf("Soldier1:::::::::: Adjusting angle \n");
- int i = 0;
- for (i = 0; i < 20; i++) {
- delay(45);
- }
- printf("Soldier1:::::::::: angle ready!\n");
- pthread_barrier_wait(&barrier);
- printf("Soldier1:::::::::: Fire! \n");
- }
- void soldier2() {
- printf("Soldier2:::::::::: Adjusting direction \n");
- int i = 0;
- for (i = 0; i < 20; i++) {
- delay(55);
- }
- printf("Soldier2:::::::::: direction ready!\n");
- pthread_barrier_wait(&barrier);
- printf("Soldier2:::::::::: Fire! \n");
- }
- void soldier3() {
- printf("Soldier3:::::::::: Filling bullet \n");
- int i = 0;
- for (i = 0; i < 20; i++) {
- delay(76);
- }
- printf("Soldier3:::::::::: bullet ready!\n");
- pthread_barrier_wait(&barrier);
- printf("Soldier3:::::::::: Fire! \n");
- }
- int main(int argc, char *argv[]) {
- printf("Entering Barrier Test\n");
- printf("creating the barrier\n");
- pthread_barrier_init(&barrier, NULL, 3);
- printf("creating the threads\n");
- pthread_create(NULL, NULL, &soldier1, NULL );
- pthread_create(NULL, NULL, &soldier2, NULL );
- pthread_create(NULL, NULL, &soldier3, NULL );
- int i = 0;
- for (i = 0; i < 10; i++) {
- printf("timer in main thread:%d\n", i);
- delay(200);
- }
- printf("end of main thread\n");
- pthread_barrier_destroy(&barrier);
- return EXIT_SUCCESS;
- }
http://blog.csdn.net/keyboardota/article/details/6867346
QNX多线程同步之Barrier(屏障)的更多相关文章
- linux多线程同步
1. 互斥量是线程同步的一种机制,用来保护多线程的共享资源.同一时刻,只允许一个线程对临界区进行访问.互斥量的工作流程:创建一个互斥量,把这个互斥量的加锁调用放在临界区的开始位置,解锁调用放到临界区的 ...
- c#中多线程同步Lock(锁)的研究以及跨线程UI的操作
本文只针对C#中,多线程同步所用到的锁(lock)作为研究对象.由于想更直观的显示结果,所以,在做demo的时候,就把多线程通过事件操作UI的代码也写了出来,留作备忘和分享吧. 其实多线程的同步,使用 ...
- C#多线程同步事件及等待句柄AutoResetEvent 和 ManualResetEvent
最近捣鼓了一下多线程的同步问题,发现其实C#关于多线程同步事件处理还是很灵活,这里主要写一下,自己测试的一些代码,涉及到了AutoResetEvent 和 ManualResetEvent,当然还有也 ...
- C# 中 多线程同步退出方案 CancellationTokenSource
C# 中提供多线程同步退出机制,详参对象: CancellationTokenSource CancellationTokenSource 中暂未提供复位操作,因此当调用Cancle 之后,若再次调用 ...
- Servlet基础(三) Servlet的多线程同步问题
Servlet基础(三) Servlet的多线程同步问题 Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率. 由于Servlet/JSP默认是以多线程模式执行的, ...
- Linux多线程同步方式
当多个线程共享相同的内存时,需要确保每个线程看到一致的数据视图,当多个线程同时去修改这片内存时,就可能出现偏差,得到与预期不符合的值.为啥需要同步,一件事情逻辑上一定是有序的,即使在并发环境下:而操作 ...
- C# 多线程同步和线程通信
多线程通信 1. 当线程之间有先后的依赖关系时,属于线程之间的通信问题.也就是后一个线程要等待别的一个或多个线程全部完成,才能开始下一步的工作.可以使用: WaitHandle Class WaitH ...
- Java多线程同步问题的探究
一.线程的先来后到——问题的提出:为什么要有多线程同步?Java多线程同步的机制是什么? http://www.blogjava.net/zhangwei217245/archive/2010/03/ ...
- Java多线程同步的方法
一 synchronized关键字 1.synchronized实现原理: ---基于对象监视器(锁) java中所有对象都自动含有单一的锁,JVM负责跟踪对象被加锁的次数.如果一个对象被解锁,其计数 ...
随机推荐
- XMind双十一会放什么大招?
XMind一直是一款备受欢迎的思维导图软件,同时也是一款开源思维导图软件,以强大的免费功能为支持,向用户提供极致的使用体验.XMind现在分别有XMind免费版(XMind Free),XMind专业 ...
- ZBrush软件特性之Layers
ZBrush®中的Layers层调控板可以在单个文档工作中添加多个层,实际上是把新建的层作为一个分离的文档,层之间可以相互影响. 使用层工作 Layers调控板为每个层都有预置存放的空间,刚启动ZBr ...
- ajax请求及遍历
$(".btn").click(function(){ $.ajax({ type:"POST", url:"../../js/info.json&q ...
- Pyhton学习——Day41
#一个完整的 JavaScript 实现是由以下 3 个不同部分组成的:# 核心(ECMAScript)# 文档对象模型(DOM) Document object model (整合js,css,ht ...
- vue自定义select组件
1.目的 看了很多element-ui的源码,决定自己实现一个简单的select组件,遇到的几个难点,便记录下来. 2.难点一 element-ui中的select组件通过v-model可以绑定数据, ...
- nysql数据库优化
硬件优化 软件优化 my.cnf参数优化,命令监控show global status\G 调优工具mysqlreport sql语句优化 索引的优化 白名单机制--百度,就是让一些不规范的语句执行查 ...
- 基于LXC的虚拟网络自动部署
一.问题: 在搭建以LXC为基础的虚拟网络时,网络参数繁多,配置过程繁琐.面临一个新的网络拓扑结构时,通常要花费大量时间来构建网络.因此,如果能通过配置文件,自动生成相对应的网络拓扑,并生成操作指令. ...
- LeetCode 856 递归思路详解
题目描述 给定一个平衡括号字符串 S,按下述规则计算该字符串的分数: () 得 1 分. AB 得 A + B 分,其中 A 和 B 是平衡括号字符串. (A) 得 2 * A 分,其中 A 是平衡括 ...
- 洛谷P1138 第k小整数
我偏不用sort Treap好题啊 看到只有一个人写Treap,而且写的不清楚,那我就来详细地写一下,方便新人学习 第(-1)部分:前置知识 二叉查找树:满足左子树的数据都比根节点小,右子树的数据都比 ...
- [luogu] P4040 [AHOI2014/JSOI2014]宅男计划(贪心)
P4040 [AHOI2014/JSOI2014]宅男计划 题目背景 自从迷上了拼图,JYY就变成了个彻底的宅男.为了解决温饱问题,JYY不得不依靠叫外卖来维持生计. 题目描述 外卖店一共有N种食物, ...