1

So I have a simple program that is supposed to add some elements to a ConcurrentQueue, then spawn 5 threads to output the elements in the Queue. However, the output is unpredictable and I assume there is some race condition that is occurring. But I don't know how or why it is happening.

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);
    }
}

I figured it might show the results out of order depending on how the OS schedules the threads, but instead it shows repeated elements in the queue. I tried using a lock to no avail, but that makes sense because there is only 1 thread accessing the queue, at least that I know of. Any help understanding this would be greatly appreciated!

Typical output:

4 Test: 400
5 Test: 400
3 Test: 400
6 Test: 500
7 Test: 500
user192148
  • 145
  • 1
  • 9

0 Answers0