内核入门(四)——线程间同步

本文深入探讨了嵌入式系统中线程间同步的重要性,并重点介绍了RT-Thread操作系统中的三种同步机制:信号量、互斥量和事件集。通过实例解析了各自的工作原理和管理方法,帮助读者理解和应用这些机制来协调多线程任务。
摘要由CSDN通过智能技术生成

前言

  嵌入式系统中有两个重要概念,线程和中断。在线程的运行中,它们有时候需要同步(即按照预定的次序顺序执行),有时候又需要互斥(同一时刻只允许一个线程访问资源);它们之间有时候也需要互相交换数据。针对这些需求,操作系统提供了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);
	}
}

1.2 利用互斥特性

  线程同步是指多个线程通过特定的机制(如互斥量,事件对象,临界区)来控制线程之间的执行顺序,也可以说是在线程之间通过同步建立起执行顺序的关系。线程的同步方式有很多种,其核心思想都是在访问临界区的时候只允许一个(或一类) 线程运行。
  以下就详细介绍RT-Thread中三种线程同步方式:

  • 信号量(semaphore)
  • 互斥量(mutex)
  • 事件集(event)

二 信号量

  《RT-Thread编程指南》中以生活中的停车场为例来理解信号量的概念:

  • 当停车场空的时候,停车场的管理员发现有很多空车位,此时会让外面的车陆续进入停车场获得停车位;
  • 当停车场的车位满的时候,管理员发现已经没有空车位,将禁止外面的车进入停车场,车辆在外排队等候;
  • 当停车场内有车离开时,管理员发现有空的车位让出,允许外面的车进入停车场;待空车位填满后,又禁止外部车辆进入。

  在此例子中,管理员就相当于信号量,管理员手中空车位的个数就是信号量的值(非负数,动态变化);停车位相当于公共资源(临界区),车辆相当于线程。车辆通过获得管理员的允许取得停车位,就类似于线程通过获得信号量访问公共资源。

2.1 信号量的工作机制

  信号量是一种轻型的用于解决线程间同步问题的内核对象,线程可以获取或释放它,从而达到同步或互斥的目的。信号量是一种非常灵活的同步方式,可以运用在多种场合中,形成锁、同步、资源计数等关系,也能方便的用于线程与线程、中断与线程间的同步中。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值