本文由RT-Thread论坛用户@出出啊原创发布:https://club.rt-thread.org/ask/article/2957.html
前言
系统优化系列先停一停,总对人指指点点会让大家反感的。今天给各位 rt-thread 使用者一些使用信号量、邮箱、消息队列等同步和通信机制的建议。
线程间同步概念
摘取 RT-Thread 官方文档中心对“线程间同步”的讲解。
同步是指按预定的先后次序进行运行,线程同步是指多个线程通过特定的机制(如互斥量,事件对象,临界区)来控制线程之间的执行顺序,也可以说是在线程之间通过同步建立起执行顺序的关系,如果没有同步,那线程之间将是无序的。
多个线程操作 / 访问同一块区域(代码),这块代码就称为临界区,上述例子中的共享内存块就是临界区。线程互斥是指对于临界区资源访问的排它性。当多个线程都要使用临界区资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步。
线程间同步的方式包括但不限于信号量、互斥量、事件集等。
线程间通信概念
说线程间同步使得不同线程的执行变得有序、有规有矩,避免了临界区的竞争访问。那么,线程间通信让多线程之间更“智能”。
线程间通信的方式包括但不限于邮箱、消息队列、信号
两种使用场景
毋庸置疑的,所有同步和通信机制都是为线程(任务)而生的。没有同步和通信的多线程是一盘散沙。在线程里调用同步和通信 API ,这是第一种使用场景。
第二种使用场景:中断向线程发送信号量、事件集、邮箱、消息队列。(互斥量千万不要在中断里使用)
我想,多数人使用过中断向线程 release / send 信号量或消息队列。从业务逻辑上讲,把中断等价于一个“线程”给另一个线程发送信号量等也是说得过去的。
但是,多数使用者忽略了一个问题,那就是,线程间同步和通信机制发送 API 无一例外会调用 rt_schedule 函数(任务调度)。虽然在中断里调用 rt_schedule 不会立马切换线程。但是,这无疑是增加中断处理任务量的!

最低0.47元/天 解锁文章
233

被折叠的 条评论
为什么被折叠?



