paint-brush
30-дневное испытание .NET. День 17. Что такое инструмент взаимосвязанных классов?к@ssukhpinder
340 чтения
340 чтения

30-дневное испытание .NET. День 17. Что такое инструмент взаимосвязанных классов?

к Sukhpinder Singh4m2024/04/07
Read on Terminal Reader

Слишком долго; Читать

Использование традиционных методов блокировки иногда может привести к снижению производительности атомарных операций. The.Net предоставляет мощный инструмент под названием «Interlocked» для всех атомарных операций, с помощью которого разработчики могут уменьшить конфликты и повысить производительность приложения. Конкурс 30 Day.Net Challenge предлагает разработчикам научиться использовать взаимосвязанные классы.
featured image - 30-дневное испытание .NET. День 17. Что такое инструмент взаимосвязанных классов?
Sukhpinder Singh HackerNoon profile picture
0-item
1-item
2-item

.Net предоставляет мощный инструмент под названием «класс Interlocked» для всех атомарных операций, с помощью которого разработчики могут уменьшить конфликты и повысить производительность приложения.

Введение

В сценариях многопоточных приложений использование традиционных методов блокировки иногда может привести к снижению производительности атомарных операций. .Net предоставляет мощный инструмент под названием «класс Interlocked» для всех атомарных операций, с помощью которого разработчики могут уменьшить конфликты и повысить производительность приложения.

Цели обучения

  • Проблема с замками
  • Использование взаимосвязанных классов

Предварительные требования для разработчиков

  • Базовое понимание языка программирования C#.

30-дневный вызов .Net

Начиная

Понимание проблемы с блокировками

Традиционно, чтобы обеспечить потокобезопасность при доступе нескольких потоков к общему ресурсу, разработчики используют блокировки. Блокировка предотвращает одновременный вход нескольких потоков в критический раздел кода, таким образом гарантируя, что только один поток может одновременно изменять общий ресурс.

 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

GitHub — ssukhpinder/30DayChallenge.Net

Программирование на C#🚀

Благодарим вас за то, что вы являетесь частью сообщества C#! Прежде чем ты уйдешь:

Следуйте за нами: Youtube | Х | LinkedIn | Dev.to Посетите другие наши платформы: GitHub