RT-thread学习笔记——使用信号量的实例分析

内核部分

信号量

在官方视频中的“生产消费者问题”示例中,生产者生产一个数据,满位信号量数值会加1,之后消费者便可以获取满位,访问数据。与此相同,消费者获取一个信号量,空位信号量数值加1,之后生产者就可以获取空位,生产数据。
在这里插入图片描述

这个逻辑很容易理解,但我有个疑问,为什么生产者每次都要释放一个满位呢?消费者在获取到一个满位,访问完数据之后,不是就会把那个满位给空出来,不应该一个满位信号量值就够了。这样一来释放满位的操作显得很不合理。

  
可是程序运行完全没问题,只能说明是我的想法出错了。

  
之后,我在官方文档中心找到了答案。原来当消费者线程获取一个满位,在访问完数据之后,满位信号量值便会减一,而不是空出来。这样子逻辑就可以解释通了,必须由生产者线程增加一个满位值。


另外我还发现一个小知识:

由于,生产者线程延时时间比消费者要短,所以生产者生产速度肯定比消费者获取速度要快。这在代码中也可以体现出来。

在这里插入图片描述
    
  

但是在生产者生产到第8组数据时,生产者的速度似乎慢了下来,生产者生产一个数据,消费者立即就能获取到。
  
在这里插入图片描述
  
  
其实并不是生产者生产慢了,而是生产者获取不到空位信号量了。空位信号量的上限是五个,生产者快于消费者的速度已经把5个信号量都消费掉了,之后就只能等消费者释放一个,生产者才能继续获取到。

猜你喜欢

转载自blog.csdn.net/qq_43690936/article/details/108131711
今日推荐