0

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

4

1 回答 1

6

.NET 框架带有一个Semaphore,所以这是最简单的方法:

var s = new Semaphore(2, 0);

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

您只需要一个全局托管的访问控制实体,外部实体可以调用该实体来获取和释放锁。在 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]);
        }
    } 
}
于 2012-07-05T08:14:16.050 回答