.Net предоставляет мощный инструмент под названием «класс Interlocked» для всех атомарных операций, с помощью которого разработчики могут уменьшить конфликты и повысить производительность приложения.
В сценариях многопоточных приложений использование традиционных методов блокировки иногда может привести к снижению производительности атомарных операций. .Net предоставляет мощный инструмент под названием «класс Interlocked» для всех атомарных операций, с помощью которого разработчики могут уменьшить конфликты и повысить производительность приложения.
Традиционно, чтобы обеспечить потокобезопасность при доступе нескольких потоков к общему ресурсу, разработчики используют блокировки. Блокировка предотвращает одновременный вход нескольких потоков в критический раздел кода, таким образом гарантируя, что только один поток может одновременно изменять общий ресурс.
private int _counter; private readonly object _syncRoot = new object(); public void IncrementCounter() { lock (_syncRoot) { _counter++; } }
Вышеупомянутый подход создает риск потенциальной проблемы с производительностью, называемой конкуренцией, когда несколько потоков пытаются одновременно получить доступ к блокировке, они приостанавливаются, за исключением того, который успешно получает блокировку.
Платформа .NET предлагает класс Interlocked как часть пространства имен System.Threading, предназначенного для эффективного выполнения атомарных операций. Атомарные операции неделимы; они выполняются совершенно без перерыва.
private int _counter; public void IncrementCounter() { Interlocked.Increment(ref _counter); }
Поскольку класс Interlocked не требует блокировок, он решает проблему конфликтов, упомянутую в традиционном подходе.
Добавьте новое имя класса IncrementClass и добавьте следующий фрагмент кода.
public static class IncrementClass { private static int _counter = 0; /// <summary> /// Outputs /// Counter value: 10 /// </summary> public static void TestIncrementCounter() { // Create an array to hold the tasks Task[] tasks = new Task[10]; // Initialize and start tasks for (int i = 0; i < tasks.Length; i++) { tasks[i] = Task.Run(() => IncrementCounter()); } // Wait for all tasks to complete Task.WaitAll(tasks); Console.WriteLine($"Counter value: {_counter}"); } public static void IncrementCounter() { // Safely increment the counter across multiple threads Interlocked.Increment(ref _counter); } }
Вызов из основного метода следующим образом:
#region Day 17: Increment Class IncrementClass.TestIncrementCounter(); #endregion
Вывод консоли:
Counter value: 10
GitHub — ssukhpinder/30DayChallenge.Net
Благодарим вас за то, что вы являетесь частью сообщества C#! Прежде чем ты уйдешь:
Следуйте за нами: Youtube | Х | LinkedIn | Dev.to Посетите другие наши платформы: GitHub