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

本文关键字:信号量 一起 为什么 | 更新日期: 2023-09-27 17:58:40

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

Enque将添加项目,deque将删除项目

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

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

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

为什么我们需要用信号量添加锁?感谢

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

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

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