所以我有一个简单的程序,它应该向ConcurrentQueue添加一些元素,然后产生5个线程来输出Queue中的元素。但是,输出是不可预测的,我认为正在发生一些竞争条件。但我不知道它是如何或为何发生的。
class Program
{
static ConcurrentQueue<int> queue = new ConcurrentQueue<int>();
static int threadsMax = 5; // Max amount of threads to spawn
static Thread[] threads = new Thread[threadsMax];
static void Main(string[] args)
{
queue.Enqueue(100);
queue.Enqueue(200);
queue.Enqueue(300);
queue.Enqueue(400);
queue.Enqueue(500);
int test = 0;
for (int i = 0; i < threadsMax; i++)
{
queue.TryDequeue(out test);
threads[i] = new Thread(delegate () { WorkerThread(test); });
threads[i].Start();
}
Console.ReadKey();
}
static void WorkerThread(int test)
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " Test: " + test);
}
}
我认为它可能会显示结果乱序,具体取决于操作系统如何调度线程,而是显示队列中的重复元素。我尝试使用锁无济于事,但这是有道理的,因为只有一个线程访问队列,至少我知道。任何帮助理解这一点将不胜感激!
典型输出:
4 Test: 400
5 Test: 400
3 Test: 400
6 Test: 500
7 Test: 500