【问题标题】:Locking method only for 2 threads锁定方法仅适用于 2 个线程
【发布时间】:2016-08-29 11:52:52
【问题描述】:

我有以下代码:

public void Execute(IJobExecutionContext context)
{
    lock (_lockObj)
    {
       // ... some HTTP job that can take 5 to 30 seconds ...
    }
}

当一个活动作业正在工作并且第二个线程进入相同的方法时,我希望它为第二个线程锁定并等待。但是,当它已经为第二个线程锁定时,然后第三个线程进入代码,我希望它退出方法而不是等待并进入作业执行。

我可以使用静态计数器变量并通过作业执行中的线程数增加/减少其值。但我想知道是否已经有更好的做法来解决这个问题。

【问题讨论】:

标签: c# multithreading locking mutex


【解决方案1】:

您正在寻找System.Threading.Semaphore

var sem = new Semaphore(0, 2);

这会创建一个初始值为 0 且最多为 2 的信号量。最多两个线程将能够调用sem.WaitOne() 而不会阻塞。之后,调用sem.WaitOne() 的线程将阻塞,直到另一个线程调用sem.Release()

有一个接受超时参数的重载WaitOne(int timeout)。如果超时传递为零,则调用不会阻塞,并立即返回。布尔返回值指示您是否成功获取信号量。在您的情况下,如果它返回 False,您只需中止操作。

【讨论】:

  • 我不确定这将如何提供我需要的东西。这将允许两个线程始终处于活动状态,而其余线程处于等待状态。我需要的不是允许 2 个线程同时运行.. 我只希望一个线程已经工作.. 但是如果已经有一个“Thread-2”被锁定并排队等待“Thread-1”,应该取消“Thread-3”并退出该方法,而不是等待......
  • @Noldor 你说得对,我忘记了那部分。我已经更新了我的答案,引用了WaitOne(int timeout),这应该会很好地为您服务。
  • 哦,是的,现在说得通了 =) 谢谢,我会尽快实现并查看结果。
【解决方案2】:

使用容量为 2 的Semaphore

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 2013-05-15
    相关资源
    最近更新 更多