问题描述
- 一个linux环境下C的多线程开发的问题
-
大家好!
我现在做的一个课题,是基于liunx环境下用C开发的。模型属于经典的生产者消费者模型,有一个生产者线程会根据接收的外部消息产生相应的任务放入缓存池,消费者再从缓存池中取任务处理。我的程序里消费者线程一开始是被阻塞的,生产者产生一个任务后会唤醒消费者,然后消费者进入循环,只要缓存池不空就处理,缓存池就是一个环形队列。
调试程序的时候发现程序会让生产者线程接连接收好几条消息然后产生好几条任务后(最多的有十几条),消费者线程才能运行,而不是产生一个任务后消费者就能及时运行。我想知道为什么会出现这种情况?
解决方案
嗨,
根据问题描述,对系统进行一下几点分析:
1.当前linux系统调度策略被配置为哪种:SCHED_OTHER,SCHED_FIFO还是SCHED_RR
--SCHED_OTHER 分时调度策略
--SCHED_FIFO 实时调度策略,先到先服务
--SCHED_RR 实时调度策略,时间片轮转
不同调度策略会影响多线程调度时机,影响整个系统的运行线路
2.生产者消费者线程的优先级
优先级是多线程调度中不可忽视的问题;本课题中如果生产者优先级高于消费者优先级,那么生产者会一直占用CPU直到主动放弃给消费者线程;这里生产者放弃CPU的时刻应该是外部消息消耗完;所以,这种情况下,如果外部消息连续一段时间内可用,那么会发生描述的问题。
所以,建议确认以上两个问题,尤其是第二点。
希望能够帮到你
时间: 2024-08-03 18:04:33