.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.
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.
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.
.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.
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
GitHub — ssukhpinder/30DayChallenge.Net
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