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