paint-brush
30 天 .NET 挑战 - 第 17 天:什么是互锁类工具?经过@ssukhpinder
338 讀數
338 讀數

30 天 .NET 挑战 - 第 17 天:什么是互锁类工具?

经过 Sukhpinder Singh4m2024/04/07
Read on Terminal Reader

太長; 讀書

使用传统的锁定技术有时会导致原子操作的性能瓶颈。.Net 为所有原子操作提供了一个称为“Interlocked”类的强大工具,开发人员可以通过它减少争用并提高应用程序的性能。30 天 .Net 挑战挑战开发人员学习如何使用 Interlocked 类。
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 | X | LinkedIn | Dev.to访问我们的其他平台: GitHub