使用C#实现信号量的最简单方法是什么?

Jav*_*aSa 0 c# semaphore

作为求职面试的问题,使用C#实现信号量的最佳和最简单的方法是什么?
请添加您的代码
谢谢!
*不使用带有Win32 API的semphores,我的意思是自己实现它.

Ada*_*rth 6

.NET框架附带一个信号量,因此这是制作一个信号量的最简单方法:

var s = new Semaphore(2, 0);
Run Code Online (Sandbox Code Playgroud)

但我猜测面试官对它背后的结构更感兴趣......

您只需要一个全局托管的访问控制实体,外部实体可以调用该实体来获取和释放锁.在C#中,您可以通过托管公开此类方法的Web服务或远程处理类来执行类似操作,并且可以保留活动锁的计数.

达到锁定限制时,您只需返回否定响应,例如false,表示无法获得锁定.

改编自Parv Sharma的评论.你可能正在看这样的事情.该信号需要锁定访问resources(如获取信号量插槽也有人看守的动作),但resources本身是什么控制的数量可用锁.然后,应用程序逻辑将指示确切锁定的内容.

class CustomSemaphore 
{
    private static readonly object semaphoreLock = new object(); 
    private static readonly object[] resources = new[] { new object(), new object(), new object(), new object(), new object(), };

    public int AcquireLockObject() 
    { 
        lock (semaphoreLock)
        {
            for (int i = 0; i < 5; i++)
            { 
                if (Monitor.TryEnter(resources[i]))
                    return i; 
            } 
        }

        return -1; // Lock unsuccessful.
    } 

    public void ReleaseLockObject(int lockIndex)
    {
        // Sanity check lockIndex range etc.

        lock (semaphoreLock)
        {
            Monitor.Exit(resources[lockIndex]);
        }
    } 
}
Run Code Online (Sandbox Code Playgroud)

  • 我做了这件事..但问题是封闭的类信号量{private object singleObject = new object; 私有对象[] objectA =新对象[5]; public objectHandle WaitOne(){foreach(var.in this.objectA){try {Monitor.TryEnter(o); return objectHandle; } catch(){继续; lock(singleObject); //检查语法return WaitOne(); public ReleaseWait(object objectHandle){Monitor.Exit(objectHandle); Monitor.Exit(singleObject)}} (2认同)