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

Posted

技术标签:

【中文标题】如何控制哪个等待线程获得下一个锁?【英文标题】:How to control which waiting thread gets next lock? 【发布时间】:2011-08-10 15:56:57 【问题描述】:

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

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

我该如何实现?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于如何控制哪个等待线程获得下一个锁?的主要内容,如果未能解决你的问题,请参考以下文章

通过线程dump,我们获得了一个正在执行的java程序的线程信息。

MySQL找出锁等待

MySQL找出锁等待

MySQL找出锁等待

Instagram gem:如何获得下一页结果?

哪个更有效,基本互斥锁或原子整数?