RT-Thread线程间同步
两个线程间的数据传递:
如何使得这两个线程默契配合?如果两个线程都需要访问共享内存,我们甚至会遇到数据一致性的问题。
首先,我们要保证,这两个线程访问的动作必须互斥进行,同一时间只应该有一个线程访问共享内存。
我们称两个线程需要访问的同一块代码区称为临界区。
danger
牢记一个设计原则:在访问临界区的时候只允许一个 (或一类) 线程运行。
在进行线程同步的时候我们需要设计一个优雅的同步机制。为此,引入信号量(semaphore)、互斥量(mutex)、和事件集(event)三大概念。
信号量
举个简单的例子理解信号量:去餐馆等位,服务员叫号,如果现在餐馆还有很多空位,服务员会让你直接进入,如果没有了,你需要等候,直到叫到你的号为止。
此时,服务员就是信号量,空位个数就是信号量的值,你和其他食客相当于线程。
信号量本质上是一个记录可用资源数量的整型计数器,在RT-Thread里是一个内核对象,线程可以获取或释放。
信号量工作机制
每个信号量对象都有一个信号量值和一个线程等待队列,信号量的值对应了信号量对象的实例数目、资源数目。
假设现在信号量值为5,那就说明有5个实例可以使用,线程可以申请;为0则申请使用的线程必须挂起,直到有实例释放。