如何控制哪个等待线程获得下一个锁定?

时间:2011-08-10 15:56:58

标签: .net synchronization locking

在标准的C#同步类(如Monitor)中,如果有几个线程等待某个对象被解锁,则没有人可以预测哪个线程将获得下一个锁。

我想为所有等待的线程分配优先级,因此它们会根据此优先级获得锁定(如果多个线程等待解锁)。

我该如何实现?

1 个答案:

答案 0 :(得分:1)

如果没有太多优先级,最简单的方法是为每个级别设置一个主锁加一个Int32,除了最高级别,表示有多少优先级较高的任务正在等待。想要获取锁的任务将Interlocked.Increment计数器为每个较低优先级,然后等待主锁并检查是否有任何更高优先级的任务正在等待。如果是这样,它将释放并重新获取主锁。否则,Interlocked.Decrement优先级较低的任务的计数器,使用该资源,并释放主锁。如果例程放弃获取锁定,它应该减少优先级较低的任务的计数器。

这种方法会有一些额外的开销来自低优先级任务获取和释放主锁,而高优先级任务需要它,但它不应该太糟糕。此外,低优先级任务在完成更高优先级任务之后获得锁定的顺序可以是有效的随机。通过为每个优先级添加锁,并使每个任务在Interlocked.Increment操作之后获取其级别的锁,可以避免此类问题;和以前一样,当锁定获取资源或放弃等待它时,应该发生递减。

相关问题