有什么创意可以避免在不执行 O/S Thread.Sleep(10) 的情况下通过协作/非抢占式多任务处理在产量或睡眠上出现死锁?通常,yield 或 sleep 调用将回调调度程序以运行其他任务。但这有时会产生死锁。
一些背景:
这个应用程序对速度有巨大的需求,到目前为止,与同行业的其他系统相比,它的速度非常快。其中一种速度技术是协作/非抢占式线程,而不是从 O/S 线程进行上下文切换的成本。
高层设计了一个优先级管理器,它根据优先级和处理时间调用任务。每个任务执行一次“迭代”工作并返回以在优先级队列中再次等待。
非抢占式线程的棘手之处在于,当您希望特定任务在工作过程中停止并等待来自不同任务的其他事件后再继续时该怎么做。
在这种情况下,我们有 3 个任务,AB 和 C,其中 A 是一个控制器,必须同步 B 和 C 的活动。首先,A 启动 B 和 C。然后 B 产生,因此 C 被调用。当 C 让步时,A 看到它们都处于非活动状态,决定是 B 运行的时间,但还不是 C 的时间。Well B 现在卡在一个调用 C 的 yield 中,所以它永远无法运行。