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

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

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

我该如何实现?

【问题讨论】:

    标签: .net synchronization locking


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-07
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多