Почему потоки работают правильно?

Рейтинг: 1Ответов: 1Опубликовано: 14.01.2023

Есть следующий кусок кода

    //private static SafeQueue<int> _safeQueue = new();
    private static List<Thread> _threads = new();
    
    private static Dictionary<int, int> _monitoringThreads = new();

    static void Main(string[] args)
    {
        Console.WriteLine("Working...");

        for (int i = 1; i <= 3; i++)
        {
            Thread thread = new Thread(TheadProc);

            _monitoringThreads.Add(thread.ManagedThreadId, 0);

            thread.Start(i);

            _threads.Add(thread);
        }

        Console.Read();

        //var count = _safeQueue.GetCountElementsInQueue();

        ;
        //_safeQueue.Dispose();
    }

    private static void TheadProc(object obj)
    {
        Console.WriteLine($"Поток: {(int)obj}");

        for (int i = 0; i < 1000000; i++)
        {
            //_safeQueue.Enqueue(i);
            
            _monitoringThreads[Thread.CurrentThread.ManagedThreadId]++;
        }
    }

Почему при добавлении значений в словарь не возникает проблем? Хотя он здесь является разделяемым ресурсом и по логике его нужно залочить или использовать Interlocked.

Ответы

▲ 1Принят

Здесь не нужны локи, всё верно.

Добавление элементов происходит синхронно в одном потоке.

Далее структура словаря, то есть состав его элементов не изменяется, то есть происходит только чтение структуры словаря, а это делать можно безопасно в скольких угодно потоках.

Есть такой шаблон проектирования Reader/Writer Lock, почитайте про него, это может добавить понимания происходящего.