paint-brush
Thử thách .NET 30 ngày - Ngày 17: Công cụ lớp lồng vào nhau là gì?từ tác giả@ssukhpinder
340 lượt đọc
340 lượt đọc

Thử thách .NET 30 ngày - Ngày 17: Công cụ lớp lồng vào nhau là gì?

từ tác giả Sukhpinder Singh4m2024/04/07
Read on Terminal Reader

dài quá đọc không nổi

Việc sử dụng các kỹ thuật khóa truyền thống đôi khi có thể gây ra tắc nghẽn về hiệu suất cho các hoạt động nguyên tử. The.Net cung cấp một công cụ mạnh mẽ được gọi là lớp “Interlocked” cho tất cả các hoạt động cơ bản mà qua đó các nhà phát triển có thể giảm bớt sự tranh chấp và cải thiện hiệu suất của ứng dụng. Thử thách 30 Day.Net thách thức các nhà phát triển tìm hiểu cách sử dụng các lớp Liên khóa.
featured image - Thử thách .NET 30 ngày - Ngày 17: Công cụ lớp lồng vào nhau là gì?
Sukhpinder Singh HackerNoon profile picture
0-item
1-item
2-item

.Net cung cấp một công cụ mạnh mẽ được gọi là lớp “Interlocked” cho tất cả các hoạt động cơ bản mà qua đó các nhà phát triển có thể giảm bớt sự tranh chấp và cải thiện hiệu suất của ứng dụng.

Giới thiệu

Trong các kịch bản ứng dụng đa luồng, việc sử dụng các kỹ thuật khóa truyền thống đôi khi có thể gây ra tắc nghẽn về hiệu suất cho các hoạt động nguyên tử. .Net cung cấp một công cụ mạnh mẽ được gọi là lớp “Interlocked” cho tất cả các hoạt động cơ bản mà qua đó các nhà phát triển có thể giảm bớt sự tranh chấp và cải thiện hiệu suất của ứng dụng.

Mục tiêu học tập

  • Vấn đề với ổ khóa
  • Sử dụng các lớp lồng vào nhau

Điều kiện tiên quyết dành cho nhà phát triển

  • Hiểu biết cơ bản về ngôn ngữ lập trình C#

Thử thách .Net 30 ngày

Bắt đầu

Hiểu vấn đề với ổ khóa

Theo truyền thống, để đảm bảo an toàn cho luồng khi nhiều luồng truy cập vào tài nguyên dùng chung, các nhà phát triển sử dụng khóa. Khóa ngăn nhiều luồng nhập đồng thời một phần quan trọng của mã, do đó, đảm bảo rằng chỉ một luồng tại một thời điểm có thể sửa đổi tài nguyên được chia sẻ.

 private int _counter; private readonly object _syncRoot = new object(); public void IncrementCounter() { lock (_syncRoot) { _counter++; } }

Cách tiếp cận nói trên gây ra nguy cơ về vấn đề hiệu suất tiềm ẩn được gọi là tranh chấp, trong đó khi nhiều luồng cố gắng truy cập vào khóa đồng thời, chúng sẽ bị tạm dừng ngoại trừ luồng lấy được khóa thành công.

Lớp học lồng vào nhau: Một cách tốt hơn

.NET framework cung cấp lớp Interlocked như một phần của không gian tên System.Threading, được thiết kế để thực hiện các hoạt động nguyên tử một cách hiệu quả. Hoạt động nguyên tử là không thể phân chia được; chúng hoàn thành hoàn toàn không bị gián đoạn.

 private int _counter; public void IncrementCounter() { Interlocked.Increment(ref _counter); }

Vì lớp Interlocked không yêu cầu khóa nên nó giải quyết được vấn đề tranh chấp như đã đề cập trong cách tiếp cận truyền thống.

Ví dụ hoàn chỉnh

Thêm tên lớp mới IncrementClass và thêm đoạn mã sau

 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); } }


Gọi từ phương thức chính như sau:

 #region Day 17: Increment Class IncrementClass.TestIncrementCounter(); #endregion


Đầu ra của bảng điều khiển:

 Counter value: 10

Mã hoàn chỉnh trên GitHub

GitHub — ssukhpinder/30DayChallenge.Net

Lập trình C#🚀

Cảm ơn bạn đã là thành viên của cộng đồng C#! Trước khi bạn đi:

Theo dõi chúng tôi: Youtube | X | LinkedIn | Dev.to Truy cập các nền tảng khác của chúng tôi: GitHub