在一个可能有很多线程的系统中,我试图确保只有四个实例一次是在一次实例化的,并且可能在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();
线处的每个站点,并且永远不会进一步进展。
您正在以所有条目都保留的方式构造Semaphore
。Semaphore
构造函数采用两个参数,请说:
如果 InitialCount 小于 maximumCount ,效果与当前线程称为
。WaitOne
( maximumcount minus (相同初始计数(时间。如果您不想为创建信号量的线程保留任何条目,请使用相同的数字用于 maximumCount 和 initialcount 。
所以进行此更改:
private static readonly Semaphore mutablelock = new Semaphore(4, 4);