workqueue代码疑问

发布于 2021-02-08 19:21:50

看工作队列的代码(rt-thread/components/drivers/src/workqueue.c),感觉是bug,想请教一下。
■场景(多核):
1.A核初始化工作队列,生成线程(_workqueue_thread_entry)后,进入睡眠。
2.B核负责调用 _workqueue_submit_work 将任务插入队列中,并唤醒 A核中的线程。
■问题:
假设B核有两个任务快速插入队列,那么A核的工作队列线程有可能只执行一个任务。
详细如下:
workqueue.png
假设 第一个任务执行完,A核中的_workqueue_thread_entry在判断队列为空,要进入睡眠的时候(①),这时候B核产生一个中断将第二个任务插入队列(②)并且执行了唤醒操作(③),之后A核继续执行①的代码,进入睡眠。
就是说,A核中的线程在判断队列为NULL后,被B核抢先运行了插入任务2以及唤醒A核线程的操作,之后A核在执行的之后正常进入睡眠,导致任务2无法被运行。

查看更多

关注者
1
被浏览
284
1 个回答
zhxqiao
zhxqiao 2021-02-18

下一个时间片还是会去执行的。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览