RTOS多线程同步问题

多线程同步问题

在多线程编程中,完成一个工作通常需要多个线程协同完成,其中会涉及到多个线程访问同一资源(共享内存)。
例如一项工作中的两个线程:一个线程从传感器中接收数据并且将数据写到共享内存中,同时另一个线程周期性的从共享内存中读取数据并发送去显示,下图描述了两个线程间的数据传递:
RTOS多线程同步问题_第1张图片
如果对共享内存的访问不是排他性的,那么各个线程间可能同时访问它,这将引起数据一致性的问题。例如,在显示线程thread1试图显示数据之前,接收线程thread2还未完成数据的写入,那么显示将包含不同时间采样的数据,造成显示数据的错乱。

将传感器数据写入到共享内存块的接收线程thread1 和将传感器数据从共享内存块中读出的线程thread2 都会访问同一块内存。为了防止出现数据的差错,两个线程访问的动作必须是互斥进行的,应该是在一个线程对共享内存块操作完成后,才允许另一个线程去操作,这样,接收线程 thread1与显示线程 thread2 才能正常配合,使此项工作正确地执行。

线程的同步方式有很多种,其核心思想都是:在访问临界区的时候只允许一个 (或一类) 线程运行。进入 / 退出临界区的方式有很多种:
1、临界区保护函数(采用关中断实现)
2、任务调度锁(采用禁止调度函数实现)
3、计数信号量(有可能造成优先级反转问题)
4、互斥量(可以防止优先级反转问题)
5、事件标志组

计数信号量

与计数信号量相关的核心API大致有三个初始化信号量等待信号量通知信号量可用
1、初始化信号量:初始化信号量的值
2、等待信号量
判断信号量的值是否大于0?
Y:资源可用,计数信号量的值减一。
N:资源不可用,将当前线程插入信号量事件队列后,挂起该任务,等待通知。
若设置超时时间,当到达超时时间时,返回该线程。
3、通知信号量可以使用
信号量事件队列中是否有等待任务?
Y:唤醒该等待任务,加入就绪表;若该任务优先级高于当前任务,则立即切换过去。
N:计数信号量加一;

你可能感兴趣的:(rtos,任务同步,操作系统)