多个任务都想获取某一个变量的状态,这时应该怎么办?如何实现互斥访问?
全局变量
我们可以在这个c文件下定义一个全局变量,多个函数都可以获取这个变量的状态,从而完成自己的功能逻辑。但是这种多个任务同时操作共享资源的操作是不安全的!比如:从汇编的角度来讲(num++分成三步:读取到寄存器R0,R0进行自加运算,内存再读取回去),一旦在这三步中间被打断,这就是不安全的数据传输。
环形缓冲区
因此,我们引入环形缓冲区(RingBuffer),它的核心是使用双指针w和r表示下一个读/写位置,生产者读操作时只对r指针进行修改,消费者写操作只对w指针进行修改,这样就是安全的。
同时,环形缓冲区还有另外的优点。
解耦生产者和消费者:环形缓冲区作为生产者(producer)和消费者(consumer)之间的一个中间层,解耦了它们之间的直接依赖。生产者不需要等待消费者处理完数据后再继续工作,同样,消费者也不需要等待生产者产生数据。
但是,环形缓冲区还是不够好。
- 如果多个任务都想来操作环形缓冲区的读、写指针怎么办?
- 如果任务A完成某些实际操作,而任务B只是等待某个状态,那么每次任务B都获得与任务A相同的运行时间,是否对CPU资源造成一种浪费?