C#多线程ConcurrentQueue意外结果

时间:2018-04-12 05:15:47

标签: c# multithreading queue

所以我有一个简单的程序,它应该向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

0 个答案:

没有答案