信号量是VxWorks提供的最常用,最快速的一种任务间通信机制。VxWorks中信号量有三种:二值信号量,互斥信号量,计数信号量。下面一一介绍这三种信号量的作用与区别。

信号量通常的作用就是是控制任务的同步与互斥,
控制同步:任务1中等待信号量X,当任务2中提供信号量后触发任务1继续运行
 
void fooInTask1()
{
semTake(...); // wait for sem X
// if sem is given, continue the execution
...
} void fooInTask2()
{
semGive(...); // give sem X and trigger task1
}
控制互斥:先通过先锁定某信号量,在临界区代码结束后释放该信号量。当然这里必须保证开始时该信号量是可用的。
 
void fooB()
{
semTake(...); // lock sem X
// critical region of code
...
semGive(...); // unlock sem X
}
而在达成这些目标时这三种信号量又有如下区别。
二值信号量,是这三种中最通用,最快速的方式。通过semBCreate创建,可以同时支持同步和互斥的控制。当用作同步时,一般创建时设置为不可用(SEM_EMPTY),而当用作互斥时,则再创建时一般设置为可用(SEM_FULL)。
互斥信号量,属于一种特殊的二值信号量,一般都被用于控制互斥访问,同时支持优先级继承,任务删除安全等选项。互斥信号量与二值相比有如下不同:
1. 通过semMCreate创建时,初值为可用
2. 对互斥信号量,semTake和semGive总是成对出现
3. 不可使用semFlush来释放信号
4. 在创建时可以选择是否支持优先级继承,任务删除安全等特性。(优先级继承是为了防止优先级反转,任务删除安全是通过taskSafe和taskUnsafe来保证运行在临界区内时不会被意外删除)

计数信号量,也就是支持计数的二值信号量,它会对信号量的释放次数进行跟踪,每次释放计数器加1,每次获取则减1,当计数值为0时试图获取信号量的任务被阻塞。它由semCCreate来创建。

最后在说明下再创建信号量时,都可以指定类型为SEM_Q_PRIORITY 或 SEM_Q_FIFO,当多个任务同时等待SEM_Q_PRIORITY类型的信号量时,当信号量来临,优先级更高的任务会获得信号量被触发,而SEM_Q_FIFO类型的话,则是最先开始等待的任务获得。

【VxWorks系列】任务间同步与通信之信号量的更多相关文章

  1. python并发——进程间同步和通信

    一.进程间同步 对于一些临界资源,不能使用并发无限消耗,就需要设置专门的临界标示,比如锁或者信号量等 from multiprocessing import Process, Lock import ...

  2. rtt学习之线程间同步与通信

    一 线程间的同步与互斥:信号量.互斥量.实践集 线程互斥是指对于临界区资源访问的排它性,如多个线程对共享内存资源的访问,生产消费型对产品的操作.临界区操作操作方法有: rt_hw_interrupt_ ...

  3. 【VxWorks系列】任务间同步与通信之共享内存

    在开始之前先说明三个概念,任务间的同步,互斥,通信. 同步,是指一个任务等待某个条件发生,而另外一个任务引发这个条件后,等待的任务会被触发执行相应的处理.这就是一个任务与另一任务之间的同步控制. 互斥 ...

  4. linux c 线程间同步(通信)的几种方法--互斥锁,条件变量,信号量,读写锁

    Linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量.信号量和读写锁. 下面是思维导图:  一.互斥锁(mutex)  锁机制是同一时刻只允许一个线程执行一个关键部分的代码. 1 . ...

  5. Linux线程间同步的几种方式

    信号量 信号量强调的是线程(或进程)间的同步:"信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在sem_wait的时候,就阻塞 ...

  6. (Java多线程系列二)线程间同步

    Java多线程间同步 1.什么是线程安全 通过一个案例了解线程安全 案例:需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果. 先来看一个线程不安全的例子 class Sell ...

  7. Win32多线程编程(3) — 线程同步与通信

      一.线程间数据通信 系统从进程的地址空间中分配内存给线程栈使用.新线程与创建它的线程在相同的进程上下文中运行.因此,新线程可以访问进程内核对象的所有句柄.进程中的所有内存以及同一个进程中其他所有线 ...

  8. Java Thread系列(四)线程通信

    Java Thread系列(四)线程通信 一.传统通信 public static void main(String[] args) { //volatile实现两个线程间数据可见性 private ...

  9. linux信号量之进程间同步

    概念 linux信号量: 允许多个线程同时进入临界区,可以用于进程间的同步. 和互斥锁(mutex)的区别: 互斥锁只允许一个线程进入临界区. 所在头文件: semaphore.h 主要函数 初始化函 ...

随机推荐

  1. JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结(转)

    hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和学习,使自己在做项目中更加 ...

  2. C++辛格尔顿

    设计模式是编程的焦点.经常在面试时进行审查,Singleton模式是最简单的.最常见的.大部分的主模式.所以大部分的采访是测试考试的Singleton设计模式. 以下我们就来看看单例模式怎样实现(C+ ...

  3. 管理集群中的 crs 管理员

     管理集群中的 crs 管理员 oracle Managing CRS Administrators in the Cluster Use the following commands to ma ...

  4. google2013校园招聘笔试题(全国)

    google2013校园招聘笔试题 1. 单项选择题1.1如果把传输速率定义为单位时间内传送的信息量(以字节计算)多少.关于一下几种典型的数据传输速率:1.使用USB2.0闪存盘,往USB闪存盘上拷贝 ...

  5. 14.10.2 File Space Management 文件空间管理:

    14.10.2 File Space Management 文件空间管理: 数据文件 你定义在配置文件形成了InnoDB的系统表空间, 文件是逻辑连接形成表空间,没有条带化使用. 你不能定义你的表在表 ...

  6. 利用ArrayList对Hashtable其进行排序

    前言: 最近在使用Hashtable的时候发现一个问题:就是当你对Hashtable进行遍历的时候整个输出结果是毫无顺序的, 上网查了一下说是Hashtable有自己内部的排序机制,如果要自定义排序的 ...

  7. robotframework ride 版本兼容问题

    在安装robotFramework ride的时候,必须需要使用wxpython 目前使用的wxpython 还必须是unicode 版本的要不然不支持中文 目前使用的 wx.version.2.8. ...

  8. java大牛list

    1 Java的未来 Java能干什么.不能干什么,一开始就要搞清楚.这对于成为一个纯种的Java程序猿至关重要. 2 构建Java运行环境 Java运行在服务器,服务器都是Linux系统,对于真正程序 ...

  9. uva 1343 非原创

    uva1343 原作者 题目题意是:给你的棋盘,在A-H方向上可以拨动,问你最少拨动几次可以是中心图案的数字一致 解题思路:回溯法,剪枝 其中要把每次拨动的字母所代表的位置提前用数组表示: 然后在如果 ...

  10. cuzysdk购物模块 36kr+本期背景图

    说好的剧透,虽然来的稍微晚不少 cuzysdk(www.cuzy.com) 是一个手机淘宝客sdk,通过使用cuzy,可以获取taobao平台的推广商品数据,移动开发者把推广的商品数据呈现给用户,用户 ...