> 백엔드 개발 > C#.Net 튜토리얼 > C#에서 원자성 작업에 Interlocked를 사용하기 위한 팁

C#에서 원자성 작업에 Interlocked를 사용하기 위한 팁

黄舟
풀어 주다: 2016-12-15 14:17:02
원래의
3016명이 탐색했습니다.

원자적 연산이란 무엇인가요?

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.

원자적 연산에 대한 기타 지침: 32비트 CPU에서 할당 명령 실행, 데이터 전송의 최대 폭은 4바이트입니다. 따라서 읽기 및 쓰기 작업이 4바이트 미만인 한 32비트 CPU는 원자적 작업입니다. 따라서 bool 및 int와 같은 유형의 연산은 그 자체로 원자 연산입니다. Interlocked가 제공하는 원자적 연산 방식은 하위 계층에 기능적 CPU 명령어를 캡슐화함으로써 완성됩니다.

위는 편집자가 소개한 C#의 원자 연산에 Interlocked를 사용하는 기술입니다. 궁금한 사항이 있으면 메시지를 남겨주시면 편집자가 답변해 드리겠습니다. 당신은 시간에. 더 많은 관련 글은 PHP 중국어 홈페이지(www.php.cn)를 주목해주세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿