![]() |
1
4
我相当肯定,没有办法对 具体的 线程,这似乎是你要做的。您只能让步,句点-由Windows调度程序决定下一个运行哪个线程。 情况是您有三个线程,A、B和C。A拥有锁,B和C正在等待它,您需要一种方法来确保B接下来执行。
显而易见的解决方案是使用多个锁和/或同步原语。您可以将
一旦b完成,那么您就向事件发出信号,让c完成。 一个(未测试的)例子是:
这实际上让线程A负责线程C何时开始执行。线程A和B将正常竞争,但线程A将向线程C发出事件信号。 |
![]() |
2
1
看一下使用监视器和 Monitor.Pulse 这并不能满足您向特定线程屈服时的具体需求,但它将允许您在线程和关键部分之间传输控制权。 我不清楚你想解决什么问题。您还可以使用 ReaderWriterLockSlim 也。 最后,我觉得你的场景是一个适合使用.NET的地方。 events 相反。 |
![]() |
3
1
(免责声明:如果您的唯一用例就是那个特定的用例,@aaronaught的简单使用manuallresetevents的解决方案可能是最简单的。) 为附加免责声明编辑: 如果您想扩展这个概念,就要非常小心死锁。 如果在某些情况下,不管B是否做过什么,你都可能希望C做工作,但如果C在等待,总是希望B先去做,这里有一个简单的解决方案:
一堆额外的代码,但从来没有人声称并发是容易的。:) |
![]() |
4
1
aaronaught的解决方案看起来不错,但我认为更简单的方法是使用一个稍微多一些的共享状态和一个锁。 基本上,在线程之间传递控制权,线程决定是否需要它们工作。如果不是这样的话,它们只需要简单的pulseall(将所有现有的等待线程移入就绪队列),然后等待(被脉冲化,然后)再次获得锁。在某种程度上,决定了什么时候可以使用threadc。
|
![]() |
a a · 为什么在这个可重入锁示例中需要引用计数? 2 年前 |
![]() |
Grant · goroutines有高空闲唤醒电话 2 年前 |
![]() |
hoaz · 如何安全地清理并发映射 6 年前 |
![]() |
Alanpatchi · int基元类型的volatile声明 6 年前 |