【发布时间】:2012-08-24 14:03:58
【问题描述】:
如果我只同时从多个线程调用 Enqueue(T) 并等待这些线程完成,然后再调用 Dequeue() 或枚举队列,它会是线程安全的吗?
var queue = new Queue<int>();
Action enqueue = () =>
{
for (int i = 0; i < 100000; i++)
queue.Enqueue(i);
};
var tasks = new[]
{
new Task(enqueue),
new Task(enqueue),
new Task(enqueue)
};
foreach (var task in tasks)
task.Start();
Task.Factory.ContinueWhenAll(tasks, t =>
{
while (queue.Count > 0)
Console.WriteLine(queue.Dequeue());
});
【问题讨论】:
-
如果你想要一个线程安全队列,为什么不使用ConcurrentQueue?
-
@nemesv:我只需要从多个线程调用 Enqueue 方法,如果我的问题中的示例是线程安全的,我不需要使用 ConcurrentQueue。
-
@Daniel:你能发布一个“如果你尝试这样做,你会得到这个例外”这样的答案,这样我可以接受吗?
-
@ŞafakGür:Adam 已经发布了一个答案,告诉您它不是线程安全的。你可以接受。
-
@Daniel:刚看到,谢谢。
标签: c# asynchronous thread-safety queue