为什么我需要将锁与信号量一起使用

Why do I need to use locks with semaphore

我想在使用信号量定义最大大小的同时创建队列。

Enque 将添加项,deque 将删除项

public void Enque(T item)
    {
        semaphore.WaitOne();
        privateQueue.Enqueue(item);

在谷歌搜索类似情况时,我发现有时会使用锁 像这样

semaphore.WaitOne();
lock(lock)
privateQueue.Enqueue(item);

为什么要加信号量锁? 谢谢

如果您的信号量允许并发访问队列(通过允许最大计数 > 1),则必须以线程安全的方式进行入队和出队。

或者,您可以使用已经是线程安全的队列,例如 ConcurrentQueue<T>,然后您就不需要锁了——只要锁 只保护队列本身。如果锁包含的内容不止于此(很难从您问题中的代码片段中判断),那么您可能仍然需要它。