为什么我需要将锁与信号量一起使用
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>
,然后您就不需要锁了——只要锁 只保护队列本身。如果锁包含的内容不止于此(很难从您问题中的代码片段中判断),那么您可能仍然需要它。
我想在使用信号量定义最大大小的同时创建队列。
Enque 将添加项,deque 将删除项
public void Enque(T item)
{
semaphore.WaitOne();
privateQueue.Enqueue(item);
在谷歌搜索类似情况时,我发现有时会使用锁 像这样
semaphore.WaitOne();
lock(lock)
privateQueue.Enqueue(item);
为什么要加信号量锁? 谢谢
如果您的信号量允许并发访问队列(通过允许最大计数 > 1),则必须以线程安全的方式进行入队和出队。
或者,您可以使用已经是线程安全的队列,例如 ConcurrentQueue<T>
,然后您就不需要锁了——只要锁 只保护队列本身。如果锁包含的内容不止于此(很难从您问题中的代码片段中判断),那么您可能仍然需要它。