원자적 연산이란 무엇인가요?
Atom은 원래 '더 이상 나눌 수 없는 가장 작은 입자'를 의미하고, Atomic Operation은 '중단될 수 없는 하나 또는 일련의 작동'을 의미합니다. . C#에서는 여러 스레드가 특정 변수에 대해 동시에 작업을 수행할 때 여러 스레드에서 얻은 값이 최신 값이 아닌 것을 방지하기 위해 원자 연산을 사용해야 합니다.
예: int result = 0;
멀티 스레드 A는 result(0)+1을 실행하고 있습니다.
멀티 스레드 B는 result(0)+1을 실행하고 있습니다. 동시에
그래서 최종 결과가 1인지 2인지는 말씀드리기 어렵습니다. 두 스레드가 CPU에서 동시에 계산하면 결과는 1입니다. 분명히 이 결과는 우리가 원하는 결과가 아닙니다. 물론 다중 스레드 실행의 고유성을 보장하기 위해 잠금을 사용할 수 있지만 그 성능은 원자적 작업에 비해 훨씬 떨어집니다.
원자적 작업에 Interlocked 사용:
.NET에서 제공하는 Interlocked 클래스를 사용하여 일부 데이터에 대해 원자적 작업을 수행합니다. 잠금처럼 보이지만 원자적 작업은 아닙니다. CPU 자체를 기반으로 하며 비차단이므로 잠금보다 더 효율적입니다.
다음은 C# 코드를 사용하여 원자성 연산을 보여줍니다.
class Program { //全局变量 private static int _result; //Main方法 static void Main(string[] args) { //运行后按住Enter键数秒,对比使用Interlocked.Increment(ref _result);与 _result++;的不同 while (true) { Task[] _tasks = new Task[100]; int i = 0; for (i = 0; i < _tasks.Length; i++) { _tasks[i] = Task.Factory.StartNew((num) => { var taskid = (int)num; Work(taskid); }, i); } Task.WaitAll(_tasks); Console.WriteLine(_result); Console.ReadKey(); } } //线程调用方法 private static void Work(int TaskID) { for (int i = 0; i < 10; i++) { //_result++; Interlocked.Increment(ref _result); } } }
result++;with Interlocked.Increment(ref _result); 실행 후 Enter 키를 누른 채 몇 초 동안 실행하면 두 줄의 차이점을 확인할 수 있습니다.
지금까지 Interlocked의 역할이 반영되었습니다. 이 글의 샘플 소스 코드를 다운로드하세요: Interlocked_Sample.