gpt4 book ai didi

c# - 合作/非抢占式线程避免死锁?

转载 作者:太空宇宙 更新时间:2023-11-03 14:31:14 26 4
gpt4 key购买 nike

有什么创意可以在不执行 O/S Thread.Sleep(10) 的情况下通过合作/非抢占式多任务处理来避免 yield 或 sleep 上的死锁?通常 yield 或 sleep 调用将回调到调度程序中以运行其他任务。但这有时会产生死锁。

一些背景:

这个应用程序对速度有巨大的需求,到目前为止,与同行业的其他系统相比,它的速度非常快。其中一种速度技术是协作/非抢占式线程,而不是从 O/S 线程进行上下文切换的成本。

高层设计一个优先级管理器,它根据优先级和处理时间调用任务。每个任务执行一次“迭代”工作,然后返回以在优先级队列中再次等待轮到它。

非抢占式线程的棘手之处在于,当您希望特定任务在工作中停止并等待来自不同任务的其他事件后再继续时该怎么做。

在这种情况下,我们有 3 个任务,A B 和 C,其中 A 是一个 Controller ,它必须同步 B 和 C 的事件。首先,A 启动 B 和 C。然后 B 让步,以便调用 C。当 C 屈服时,A 看到它们都处于非事件状态,因此决定是 B 运行的时间,但还不是 C 运行的时间。 Well B 现在卡在了一个叫做 C 的 yield 中,所以它永远无法运行。

最佳答案

我认为处理这个问题的最干净的方法可能是将屈服(一个线程决定它已经处理了足够一段时间)与阻塞(等待特定事件)分开。这使得为​​已让出的线程分配时间变得相对容易,但可以避免因尝试运行被阻塞的线程而导致死锁。通常,您想对哪个线程阻塞在哪个其他线程上进行拓扑排序,这样您就可以为其他正在等待的线程留出时间。这应该给出一个 DAG——图中的任何循环都表示死锁。

关于c# - 合作/非抢占式线程避免死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2521527/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com