뮤텍스가 제대로 구현되면 동시에 잠글 수 없습니다. 이를 위해 유용한 속성을 가진 원자 연산 (한 순간에 객체에 대해 일어나는 유일한 작업 임)이 필요합니다.
이러한 작업 중 하나는 x86 아키텍처에서 xchg
(exchange)입니다. 예를 들어 xchg eax, [ebp]
은 주소 ebp
의 값을 읽고, ebp
의 주소에 의 값을 쓰고 그 값에 동시 읽기 및 쓰기로 인터리브되지 않도록 보장하면서 eax
을 읽기 값으로 설정합니다.
이제 뮤텍스를 구현할 수 있습니다. 잠 그려면 1
을 eax
에로드하고 eax
을 뮤텍스의 값으로 교환하고 eax
을 확인하십시오. 1
인 경우 이미 잠겼으므로 잠자기하고 나중에 다시 시도하십시오.0
인 경우 뮤텍스를 잠갔습니다. 잠금을 해제하려면 0
값을 뮤텍스에 씁니다.
중요한 세부 정보는 여기에서 볼 수 있습니다. 예를 들어 x86의 xchg
은 단일 프로세서에서 선점 형 멀티 태스킹을 수행 할 수있을만큼 충분히 기본입니다. 멀티 코어 시스템 등 여러 프로세서간에 메모리를 공유하는 경우 접두어 (예 : , xchg eax, [ebp]
이 아닌) (ensures that only one processor can access that memory while the instruction is executed)를 사용하지 않으면 충분하지 않습니다.
필자는 멀티 코어 시스템에 OS/하이퍼 바이저 레벨 또는 CPU/버스 관리에서 어떤 종류의 메커니즘이 있으므로 이것이 발생하지 않을 것이라고 확신합니다. –
그들은 한번만 획득 할 수있는 뮤텍스 포인트가 될 수 없다. –
두 개의 스레드 (또는 10 개의 스레드)가 동시에 mutex를 잠글 수 있지만 _ 하나만 성공할 수있다. 또한 단일 코어에서 OS가 스레드에서 스레드로 항상 전환되며 뮤텍스를 잠그려고 할 때 한 스레드에서 다른 스레드로 전환 할 수 있으며 즉시 잠금을 시도하는 다른 스레드로 전환 할 수 있습니다 동일한 뮤텍스가 필요하며 올바르게 작동해야합니다. – gnasher729