RT-Thread线程同步
前言
嵌入式系统中有两个重要概念,线程和中断。在线程的运行中,它们有时候需要同步(即按照预定的次序顺序执行),有时候又需要互斥(同一时刻只允许一个线程访问资源);它们之间有时候也需要互相交换数据。针对这些需求,操作系统提供了IPC(Internal Process Communication)机制,即进(线)程间通信机制。通过IPC机制,我们可以协调多个线程间的工作,共同完成任务。后续主要介绍RT-Thread的IPC机制,包括信号量、互斥量、事件集、邮箱、消息队列等。
一 临界区与线程同步
临界资源是指一次仅允许一个线程访问的共享资源,它可以是一块内存区,也可以一个具体的硬件设备。线程对临界资源的访问具有排他性(互斥性),这避免了多个线程同时访问一个资源时引起的数据一致性问题。
每个线程中访问临界资源的代码就称为临界区。当多个线程都要使用临界区资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。
临界区保护的两种途径:
1.1 关闭系统调度
- 禁止调度
禁止调度就是在访问临界资源前,把线程调度器锁住,禁止线程切换;再访问完成后解锁调度器,这是常用的临界区保护方法,如下代码段示意:
void thread_entry (void *parameter)
{
while(1)
{
……
/*调度器上锁,禁止线程切换,系统仅响应中断*/
rt_enter_critical();
/*以下进入临界区*/
……
/*调度器解锁*/
rt_exit_critical();
}
}
- 关闭中断
所有的线程调度是建立在中断的基础上,关闭中断也可以起到关闭线程调度的作用,如下示意:
void thread_entry (void *parameter)
{
while(1)
{
……
rt_base_t level;
/*关闭中断,禁止线程调度*/
level = rt_hw_interruppt_disable();
/*以下进入临界区*/
……
/*开启中断*/
rt_hw_interruppt_enable(level)