为什么使用信号量时,这4个线程锁定



在一个可能有很多线程的系统中,我试图确保只有四个实例一次是在一次实例化的,并且可能在5-60秒后发布。这些实例是在每个线程开始时创建的,并在线程结束时被破坏。

我还想一次一次构建一个实例。因此,我的逻辑是在对象实例化过程中使用锁,但也将整个线程逻辑包装为信号量。

private static readonly object padlock = new object();
private static readonly Semaphore mutablelock = new Semaphore(0, 4);
// called at the start of a long running thread
public static Object GetNewInstance()
{
    // semaphore used to prevent more than 4 objects from existing at any time
    mutablelock.WaitOne();
    // lock used to prevent more than one object being instantiated at a time
    lock (padlock)
    {
        var instance = new Object();
        return instance;
    }
}
// called at the end of a long running thread
public static void ReleaseInstance()
{
    mutablelock.Release();
}

该程序具有四个线程(使用调试停止点查看时(在mutablelock.WaitOne();线处的每个站点,并且永远不会进一步进展。

您正在以所有条目都保留的方式构造SemaphoreSemaphore构造函数采用两个参数,请说:

如果 InitialCount 小于 maximumCount ,效果与当前线程称为 WaitOne( maximumcount minus (相同初始计数(时间。如果您不想为创建信号量的线程保留任何条目,请使用相同的数字用于 maximumCount initialcount

所以进行此更改:

private static readonly Semaphore mutablelock = new Semaphore(4, 4);

相关内容

  • 没有找到相关文章

最新更新