如果多个线程同时访问同一内存,可能出现数据不一致的问题,所以要引入线程同步。
所谓同步,就是指按预定的先后次序进行运行,线程同步是指多个线程通过特定的机制(如互斥量,事件对象,临界区)来控制线程之间的执行顺序。
多个线程操作 / 访问同一块区域(代码),这块代码就称为临界区。
线程互斥就是指对于临界区资源访问的排它性。
核心思想:在访问临界区的时候只允许一个 (或一类) 线程运行
方式有很多种:
1)调用 rt_hw_interrupt_disable() 进入临界区,调用 rt_hw_interrupt_enable() 退出临界区;
2)调用 rt_enter_critical() 进入临界区,调用 rt_exit_critical() 退出临界区。

1.信号量

信号量是一种轻型的用于解决线程间同步问题的内核对象,线程可以获取或释放它,从而达到同步或互斥的目的。

  1. 使用 rt_sem_create 创建信号量,得到信号量控制块 rt_sem_t。<br />使用 rt_sem_take rt_sem_release 实现 P/V 操作(或 Signal/Wait 操作)。<br /> 考虑一种情况:现有三个线程 HML,优先级分别为高、中、低。L 线程正在使用某资源,此时 H 线程想要使用该资源,因此必须等待 L 线程先将资源释放。这时 M 线程从阻塞态进入就绪态,于是调度器打断 L 线程去执行 M 线程。于是就出现了高优先级的 H 却要等待中优先级的 M 的情况。这种现象称为“优先级翻转”。<br /> 为了避免这种情况,系统将 L 线程提升到 H 线程同一级,这样就避免了 L 线程被 M 线程打断。等 L 线程释放资源后,再将 L 线程的优先级恢复到低。这个优先级提升到 H 的过程,叫做“优先级继承”。互斥量支持优先级继承,而信号量不支持。<br />** **


2.互斥量

使用 rt_mutex_create 创建互斥量,得到互斥量控制块 rt_mutex_t。
使用 rt_mutex_take 和 rt_mutex_release 实现加锁和解锁操作。
互斥量不能在中断服务程序中使用 不能够更改持有互斥量线程的优先级

3.事件集