인터로 잠긴 변수 액세스

애플리케이션은 여러 스레드에서 공유하는 변수에 대한 액세스를 동기화해야 합니다. 또한 애플리케이션은 이러한 변수에 대한 작업이 원자적으로 수행되도록 해야 합니다(전체에서 수행되거나 전혀 수행되지 않음).

올바르게 정렬된 32비트 변수에 대한 간단한 읽기 및 쓰기는 원자성 작업입니다. 즉, 변수의 한 부분만 업데이트되지 않습니다. 모든 비트는 원자성 방식으로 업데이트됩니다. 그러나 액세스가 동기화되도록 보장되지는 않습니다. 두 스레드가 동일한 변수에서 읽고 쓰는 경우 다른 스레드가 쓰기 작업을 수행하기 전에 한 스레드가 읽기 작업을 수행할지 여부를 확인할 수 없습니다.

올바르게 정렬된 64비트 변수에 대한 간단한 읽기 및 쓰기는 64비트 Windows에서 원자성입니다. 64비트 값에 대한 읽기 및 쓰기는 32비트 Windows에서 원자성으로 보장되지 않습니다. 다른 크기의 변수에 대한 읽기 및 쓰기는 플랫폼에서 원자성으로 보장되지 않습니다.

The Interlocked API

상호 잠긴 함수는 여러 스레드에서 공유하는 변수에 대한 액세스를 동기화하기 위한 간단한 메커니즘을 제공합니다. 또한 원자성 방식으로 변수에 대한 작업을 수행합니다. 변수가 공유 메모리에 있는 경우 서로 다른 프로세스의 스레드에서 이러한 함수를 사용할 수 있습니다.

InterlockedIncrementInterlockedDecrement 함수는 변수를 원자성 연산으로 증가 또는 감소시키는 데 관련된 단계를 결합합니다. 이 기능은 시스템이 한 스레드의 실행을 중단하여 프로세서 시간을 다른 스레드에 부여할 수 있는 멀티태스킹 운영 체제에서 유용합니다. 이러한 동기화가 없으면 두 스레드가 동일한 값을 읽고, 1씩 증분하고, 2가 아닌 1의 총 증가에 대한 새 값을 저장할 수 있습니다. 상호 잠긴 변수 액세스 함수는 이러한 종류의 오류로부터 보호합니다.

InterlockedExchangeInterlockedExchangePointer 함수는 지정된 변수의 값을 원자성으로 교환합니다. InterlockedExchangeAdd 함수는 두 개의 변수를 함께 추가하고 결과를 변수 중 하나에 저장하는 두 가지 작업을 결합합니다.

InterlockedCompareExchange, InterlockedCompare64Exchange128InterlockedCompareExchangePointer 함수는 두 값을 비교하고 비교 결과에 따라 변수 중 하나에 세 번째 값을 저장하는 두 가지 작업을 결합합니다.

InterlockedAnd, InterlockedOrInterlockedXor 함수는 각각 AND, OR 및 XOR 연산을 원자성으로 수행합니다.

64비트 메모리 값 및 주소에 대해 인터로크된 변수 액세스를 수행하도록 특별히 설계되었으며 64비트 Windows에서 사용하도록 최적화된 함수가 있습니다. 이러한 각 함수는 이름에 "64"를 포함합니다. 예를 들어 InterlockedDecrement64InterlockedCompareExchangeAcquire64입니다.

대부분의 연동 함수는 모든 Windows 플랫폼에서 전체 메모리 장벽을 제공합니다. 기본 인터로킹된 변수 액세스 작업을 특정 프로세서에서 지원하는 획득 및 해제 메모리 순서 의미 체계와 결합하는 함수도 있습니다. 이러한 각 함수는 이름에 "Acquire" 또는 "Release"라는 단어를 포함합니다. 예를 들어 InterlockedDecrementAcquireInterlockedDecrementRelease입니다. 메모리 획득 의미 체계는 현재 스레드에서 수행하는 메모리 작업이 다른 메모리 작업을 시도하기 전에 표시되도록 지정합니다. 릴리스 메모리 의미 체계는 다른 모든 메모리 작업이 완료된 후 현재 스레드에서 수행하는 메모리 작업이 표시되도록 지정합니다. 이러한 의미 체계를 사용하면 메모리 작업을 특정 순서로 강제로 수행할 수 있습니다. 보호된 지역을 입력할 때 의미 체계 획득을 사용하고, 이 영역을 떠날 때 의미 체계를 해제합니다.

컴파일러 내장 함수

동기화 및 다중 프로세서 문제