두 개 이상의 스레드가 동시에 잠금을 획득 할 수는 없습니다. 예를 들어 몇 가지 유형의 동기화 방법이 있습니다.
활성 대기-스핀 잠금
의사 코드 :
1. while ( xchg(lock, 1) == 1); - entry protocole
XCHG는 먼저 "lock"변수에 새 값을 설정 한 다음 이전 값을 반환하는 원자 연산 (x86 아키텍처에 있음)의 예입니다. 원자는 위의 예에서 새 값을 설정하고 이전 값을 반환하는 사이에 중단 될 수 없음을 의미합니다. 원자력-결정 론적 결과.
2. Your code
3. lock = 0; - exit protocol
잠금이 0과 같으면 다른 스레드가 중요한 섹션으로 들어가는 동안 루프가 종료됩니다.
스레드 중단-예를 들어 세마포 계산
이 두 개의 원자 작업을 존재 .Wait()
하고 .Signal()
변수가 호출 할 수 있습니다 정수 우리가 int currentValue
.
Wait():
if (currentValue > 0) currentValue -= 1;
else suspend current thread;
Signal():
If there exists thread suspended by semaphore wake up one of them
Else currentValue += 1;
이제 중요한 섹션 문제를 해결하는 것이 정말 쉽습니다.
의사 코드 :
mySemaphore.Wait();
do some operations - critical section
mySemaphore.Signal();
일반적으로 프로그래밍 스레드 API는 세마포어 임계 섹션에서 최대 동시 스레드를 지정할 수있는 기능을 제공해야합니다. 분명히 멀티 스레드 시스템 (뮤텍스, 모니터, 이진 세마포어 등)에는 더 많은 유형의 동기화가 있지만 위의 아이디어를 기반으로합니다. 스레드 일시 중단을 사용하는 메소드가 활성 대기보다 선호되어야한다고 주장 할 수 있습니다 (cpu가 낭비되지는 않음). 항상 진실은 아닙니다. 스레드가 일시 중단되면 컨텍스트 전환이라는 비싼 작업이 수행됩니다. 그러나 대기 시간이 짧은 경우에는 합리적입니다 (스레드 수 ~ 코어 수).