【发布时间】:2014-07-31 02:13:37
【问题描述】:
我有以下代码抛出SemaphoreFullException,我不明白为什么?
如果我将_semaphore = new SemaphoreSlim(0, 2) 更改为
_semaphore = new SemaphoreSlim(0, int.MaxValue)
然后一切正常。 任何人都可以找出这段代码的错误并向我解释。
class BlockingQueue<T>
{
private Queue<T> _queue = new Queue<T>();
private SemaphoreSlim _semaphore = new SemaphoreSlim(0, 2);
public void Enqueue(T data)
{
if (data == null) throw new ArgumentNullException("data");
lock (_queue)
{
_queue.Enqueue(data);
}
_semaphore.Release();
}
public T Dequeue()
{
_semaphore.Wait();
lock (_queue)
{
return _queue.Dequeue();
}
}
}
public class Test
{
private static BlockingQueue<string> _bq = new BlockingQueue<string>();
public static void Main()
{
for (int i = 0; i < 100; i++)
{
_bq.Enqueue("item-" + i);
}
for (int i = 0; i < 5; i++)
{
Thread t = new Thread(Produce);
t.Start();
}
for (int i = 0; i < 100; i++)
{
Thread t = new Thread(Consume);
t.Start();
}
Console.ReadLine();
}
private static Random _random = new Random();
private static void Produce()
{
while (true)
{
_bq.Enqueue("item-" + _random.Next());
Thread.Sleep(2000);
}
}
private static void Consume()
{
while (true)
{
Console.WriteLine("Consumed-" + _bq.Dequeue());
Thread.Sleep(1000);
}
}
}
【问题讨论】:
-
您的信号量容量为 2,但您将 100 个项目排入队列...请参阅具有上限的 BlockingQueue 实现。 stackoverflow.com/questions/7841390/how-to-use-a-mutex
-
@David 容量为 2 意味着 2 个线程可以同时运行,不是吗?
-
@L.B 容量为 2 表示 2 个线程可以同时运行,不是吗?
-
@ShrShr 阅读构造函数的文档并自己找出答案。
标签: c# multithreading