野火RTT 19章信号量
2018年12月29日
10:46

相当于裸机中的标志
信号量:实现线程间的通信,实现线程间的同步货临界资源的互斥访问。
多线程系统中,线程间需要同步或互斥实现临界资源保护。

二值信号量:用于线程间、线程与中断间的同步。其他线程获取,信号量为0,释放信号量为1。二值信号量最大计数值为1。也就是信号量的个数最大为1。是计数型信号量的特殊情况(计数最大值为1)。

例子:比如某线程可以使用二值信号量等待中断里标记发生,当没有这个标记发生时将线程挂到阻塞态,当发生对应中断了,在中断中释放这个信号量。就会把阻塞态进入就绪态。

释放信号量函数会将调用恢复阻塞态线程的函数,同时会调用调度函数执行线程调度。

二值信号量:若还有因读信号量而被阻态的线程,那只能等被阻态的所有线程都就绪后,再次释放才能真正释放。比如,我二值信号量我设定初始值为0,然后有个线程获取它,那个线程就会挂起,然后等中断里释放这个信号量时,“释放”的操作是这样的:若有因这个信号量而阻塞的线程则先恢复这个线程并执行一次调度——但此时是信号量这个值和线程恢复二选一的,若存在阻塞的线程,那么释放信号量时其值就不累加了。所以不是说释放二值信号量它的值就会++!不是说释放二值信号量它的值就会++!不是说二值信号量释放它的值就会++! 而是在没有阻塞情况下,是++的,在有阻塞线程下,不++的,而是先恢复线程的!
信号量释放函数如下:
rt_err_t rt_sem_release(rt_sem_t sem)
{
register rt_base_t temp;
register rt_bool_t need_schedule;

/* parameter check */
RT_ASSERT(sem != RT_NULL);
RT_ASSERT(rt_object_get_type(&sem->parent.parent) == RT_Object_Class_Semaphore);RT_OBJECT_HOOK_CALL(rt_object_put_hook, (&(sem->parent.parent)));need_schedule = RT_FALSE;/* disable interrupt */
temp = rt_hw_interrupt_disable();RT_DEBUG_LOG(RT_DEBUG_IPC, ("thread %s releases sem:%s, which value is: %d\n",rt_thread_self()->name,((struct rt_object *)sem)->name,sem->value));if (!rt_list_isempty(&sem->parent.suspend_thread))
{/* resume the suspended thread */rt_ipc_list_resume(&(sem->parent.suspend_thread));need_schedule = RT_TRUE;
}
elsesem->value ++; /* increase value *//* enable interrupt */
rt_hw_interrupt_enable(temp);/* resume a thread, re-schedule */
if (need_schedule == RT_TRUE)rt_schedule();return RT_EOK;

}

二值信号量特性:(1)前提是要先创建信号量。(2)获取和释放要成对出现。(3)读取未被释放好的二值信号量的所有线程都会被移除就绪表而被挂起,同时这些线程又会按照FIFO先进先出或者优先级的顺序被挂到这个二值信号量控制块下的成员suspend链表下。调用释放函数时从suapend的next恢复掉一个线程——而不是一下子恢复掉所有线程,一个一个来!(4)二值信号量的意义:这样子就完成了第一个线程中获取信号量函数到释放信号量函数之间的代码运行完了,才能再去运行下个获取同样这个信号量的线程中获取和释放的这部分代码。以此类推。假如把获取信号量和释放信号量这个区间当成代码区间。理想的执行顺序:先运行存在这种区间的最高优先级线程的区间1这段代码,再运行次高优先级线程的区间2,在运行第3高优先级线程的区间3,……,直到最后用到这个二值信号量的线程中的区间n。实际上的运行顺序还得根据延时时间动态判断。

RTT的线程同步篇——信号量相关推荐

  1. RTT的线程同步篇——总结

    一.信号量和互斥量的区别 2018年12月29日 10:47 信号量强调做事的步骤,有先后. 信号量可以在任何任务.中断里释放信号量,释放了你才能做下一步. 信号量可能发生优先级翻转. 信号量不能递归 ...

  2. RTT的线程同步篇——互斥量

    野火RTT第20章互斥量 2018年12月29日 10:47 互斥量不能在中断服务程序中使用. 互斥量是特殊的二值信号量,其"特殊"在哪呢?互斥量不同于二值信号量的地方在于:互斥量 ...

  3. RTT的线程同步篇——异常管理

    野火RTT第25章异常 2018年12月29日 10:47 一.中断中使用RRT的IPC通信机制. 异常分为同步异常和异步异常. 中断属于异步异常. RTT建议在中断中采用信号量.消息.事件来标记. ...

  4. RTT的线程同步篇——事件

    野火RTT第21章事件 2018年12月29日 10:47 事件也是线程间通信,仅用于实现线程间同步,而不能传输数据.可以在中断中发送事件. 一对多:一个线程等待多个事件触发:多个事件中的任意一个发生 ...

  5. 【Linux】线程同步之信号量同步

    linux中两种基本的同步方法是信号量和互斥量.这两种方法很相似,而且它们可以相互通过对方来实现. 信号量概述 下面介绍用信号量进行同步. 信号量概念由荷兰科学家Dijkstra首先提出.信号量是一个 ...

  6. 【Windows】线程漫谈——线程同步之信号量和互斥量

    本系列意在记录Windwos线程的相关知识点,包括线程基础.线程调度.线程同步.TLS.线程池等 信号量内核对象 信号量内核对象用来进行资源计数,它包含一个使用计数.最大资源数.当前资源计数.最大资源 ...

  7. 《Windows via C/C++》学习笔记 —— 内核对象的“线程同步”之“信号量”

    "信号量内核对象"用于对资源进行计数. 在信号量内核对象内部,和其他内核对象一样,有一个使用计数,该使用计数表示信号量内核对象被打开的次数. 信号量内核对象中还有两个比较重要的数据 ...

  8. 【Linux学习笔记】线程同步 之 信号量 之 sem_t结构体

    sem_t结构体: 里面封装了两个数据: 1.__align:long int 型,保存了信号量的值: 2.__size:char型,功能未知,常为空值,一般不需要使用; sem_t mutex;se ...

  9. 多线程怎么保证数据安全_Python threading实现多线程 提高篇 线程同步,以及各种锁...

    本文主要讲多线程的线程之间的资源共享怎么保持同步. 多线程基础篇见,木头人:Python threading实现多线程 基础篇 Python的多线程,只有用于I/O密集型程序时效率才会有明显的提高,如 ...

最新文章

  1. Leangoo:用敏捷开发管理思维做团队协作的SaaS软件
  2. matlab中实时脚本与纯代码脚本
  3. ORACLE 11GR2 RAC的网络规划解析
  4. POJ 3264 Balanced Lineup
  5. Java注解原来如此通俗易懂
  6. 第八章xgboost/lightGBM
  7. oracle监听程序无法分配,Oracle监听器服务不能启动的解决方法
  8. axios post object object_深入学习Axios源码(构建配置)
  9. 安装centos6.7和deepin15的折腾记录
  10. linux中文件输出输入,linux中文件输入输出的管理
  11. ZooKeeper官方文档学习笔记01-zookeeper概述
  12. 【BZOJ】1001: [BeiJing2006]狼抓兔子 Dinic算法求解平面图对偶图-最小割
  13. ArcGIS图像配准方法
  14. Java素数怎么判断
  15. dw添加下拉菜单_Dreamweaver怎么创建下拉菜单
  16. dell 服务器 重装Linux系统
  17. 评测|HPE Nimble AF全闪存系列,诠释真正的高端存储
  18. TCP/IP路由技术(第1卷)(第2版) + TCP/IP路由技术(第2卷)(第2版)
  19. 拉伸——CAD做三维图的常用指令
  20. 创建oracle数据库到达梦数据库的dblink

热门文章

  1. 安装Quagga路由软件
  2. Swing编程基础 之三
  3. Mac 实用开发工具
  4. Mybatis高级应用 查询缓存
  5. opensource项目_生日快乐,Opensource.com:9年
  6. raspberry pi_如何进行Raspberry Pi聚会
  7. 物联网思维导图_物联网将如何改变我们的思维方式
  8. Bootstrap3 警告框插件的事件
  9. Bootstrap Page header
  10. eclipse html tab宽度,Eclipse 设置Tab键为4个空格