Почему потоки работаю правильно?
Есть следующий кусок кода
//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 шт):
Автор решения: aepot
→ Ссылка
Здесь не нужны локи, всё верно.
Добавление элементов происходит синхронно в одном потоке.
Далее структура словаря, то есть состав его элементов не изменяется, то есть происходит только чтение структуры словаря, а это делать можно безопасно в скольких угодно потоках.
Есть такой шаблон проектирования Reader/Writer Lock, почитайте про него, это может добавить понимания происходящего.