信号量是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. axure篇

    QQ:1187362408 欢迎技术交流和学习 axure篇(axure rp 7.0): TODO: 1.汉化组件及菜单选项 界面组件汉化: 菜单汉化: 2,了解axure 控制器中各项功能区中的菜 ...

  2. Android漫游记(4)---.so文件动态调试一例

    Android平台的动态调试一直以来是个困扰我等Coder的头疼问题,特别是对于本地的动态调试支持.能够说是"弱智"级别的,不知道Google的新版NDK和新出的Android S ...

  3. C++要点

           以下的这些要点是对全部的C++程序猿都适用的.我之所以说它们是最重要的,是由于这些要点中提到的是你通常在C++书中或站点上无法找到的.如:指向成员的指针,这是很多资料中都不愿提到的地方, ...

  4. CheckBox in ListView

    CheckBox in ListView Listview 在android中是经常用的组件,一些特殊情况下,系统提供的list view item 不够用, 不能满足需求,那么就需要自定义listV ...

  5. ASP.NET - 记住滚动条的位置

    MaintainScrollPositionOnPostback ="true" 如果是滚动条在最下面,那么如果刷新页面,滚动条回到最上面. 使用这个属性之后,滚动条会在刷新之前的 ...

  6. PHP学习之-正则表达式

    PHP学习之-正则表达式 1.什么是正则表达式 正则表达式是对字符串处理额一种逻辑公式,就是用特定的字符串组合成一个规则的字符串,称之为正则匹配模式 $p = '/apple/'; $str = '' ...

  7. perl 获取文件内容里第一个AAA和最后一个AAA

    <pre name="code" class="html">[root@wx03 ~]# cat -n aaa 1 3`13 2 edqae 3 d ...

  8. 基于visual Studio2013解决面试题之0702输出数字

     题目

  9. 两个栈实现队列+两个队列实现栈----java

                                               两个栈实现队列+两个队列实现栈----java 一.两个栈实现一个队列 思路:所有元素进stack1,然后所有出s ...

  10. qt槽函数中,窗口镶嵌窗口的问题,求解

    my_label=newQLabel(ui->widget); my_Label->setText("yvhvv"); 我把这插入到构造函数中,正确显示. 我把这插入到 ...