有什么创造性的想法来避免在不执行O/S Thread.Sleep(10)的情况下使用协作/非抢占式多任务来避免产量或睡眠上的死锁吗?通常,让出或休眠调用将回调到调度程序以运行其他任务。但这有时会产生死锁。
一些背景知识:
这个应用程序对速度有着巨大的需求,而且到目前为止,与同行业中的其他系统相比,它的速度非常快。速度技术之一是协作/非抢占式线程,而不是从O/S线程切换上下文的成本。
高层设计了一个优先级管理器,根据优先级和处理时间对任务进行调用。每个任务执行一次“迭代”工作,并返回优先级队列中再次等待轮到它。
非抢占式线程的棘手之处在于,当您希望某个特定任务在工作中途停止并等待来自不同任务的其他事件后再继续执行时,该如何处理。
在本例中,我们有3个任务,A、B和C,其中A是一个控制器,它必须同步B和C的活动。首先,A启动B和C。然后B产生,所以C被调用。当C让步时,A发现它们都是不活动的,决定B是时候运行了,但还不是C的时候。那么B现在被困在一个叫做C的收益率中,所以它永远不会运行。
发布于 2010-03-30 06:00:04
嗯,我意识到,理想的解决方案是如果C#语言支持真正的“延续”来展开堆栈,并在后面停止的地方继续。
在这种情况下,我们可以通过允许这种情况下的任务将"isInterrupted“标志设置为true并返回--从而展开堆栈,来进行我们自己的临时替换。
然后,当调度器想要再次调度该任务的处理时间时,它将看到isInterrupted并跳过已经完成的处理,以便使用简单的if语句直接跳转到中断位置。
诚心诚意,韦恩
发布于 2010-03-26 15:19:58
我认为处理这个问题的最干净的方法可能是将让出(一个线程决定它已经处理了一段时间)和阻塞(等待一个特定的事件)分开。这使得给已经让步的线程分配时间相对容易,但避免了试图运行阻塞的线程时出现死锁。通常,您希望对正在阻塞其他线程的线程进行拓扑排序,以便将时间分配给其他线程正在等待的线程。这应该会给出一个DAG --图中的任何循环都表示死锁。
https://stackoverflow.com/questions/2521527
复制相似问题