作为求职面试的问题,使用C#实现信号量的最佳和简单方法是什么?
请添加您的代码
谢谢!
* 不使用 semphores 与 Win32 API,我的意思是自己实现它。
.NET 框架带有一个信号量,所以这是最简单的方法:
var s = new Semaphore(2, 0);
但我猜面试官对它背后的结构更感兴趣......
您只需要一个全局托管的访问控制实体,外部实体可以调用该实体来获取和释放锁。在 C# 中,可以通过承载公开此类方法并可以保留活动锁计数的 Web 服务或远程处理类来执行类似的操作。
当达到锁定限制时,您只需返回否定响应(例如 false)表示无法达到锁定。
改编自评论中的帕夫·夏尔马。你可能会看到这样的东西。信号量需要锁定对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]);
}
}
}