Windows OS 동기화 개체를 사용하지 않는 자체 잠금을 구현하는 데는 좋은 이유가있을 수 있습니다. 그러나 이렇게하는 것은 "날카로운 막대기"입니다."발에서 몸을 찌르는 것이 쉽습니다.
다음은 예입니다. 하드웨어 컨텍스트와 동일한 수의 스레드를 실행 중이며 대기중인 스레드 중 하나를 깨우는 대기 시간 잠금 장치가 매우 중요하기 때문에 사용자 공간에서 완전히 구현 된 스핀 잠금 장치를 선택할 수 있습니다. 대기중인 스레드가 잠금 장치에서 회전하는 유일한 스레드 인 경우 잠금 장치를 소유 한 스레드에서 대기중인 스레드로 전송하는 대기 시간 동일한 상황에서 OS 잠금을 가진 스레드에 신호를 보내는 대기 시간보다 훨씬 빠른 속도로 오너 스레드와 캐시 스레드를 대기 스레드로 이동하는 지연 일뿐입니다.
하지만 시나리오 이렇게하기를 원한다면 꽤 좁습니다. 하드웨어 쓰레드보다 더 많은 소프트웨어 쓰레드를 갖기 시작할 때, 아마 후회할 것입니다. 이 시나리오에서는 스핀 락을 돌리고 아무것도하지 않고 전체 OS 스케줄링 퀀텀을 보낼 수 있습니다. 또한 전력을 신경 쓰면 스핀 록이 프로세서가 저전력 상태가되는 것을 방지하기 때문에 좋지 않습니다.
나는 이식성 주장을 잘 모르겠다. 휴대용 라이브러리에는 동기화를 위해 다양한 OS API를 추상화하는 OS 이식성 계층이 있습니다. 잠금을 다루는 경우 pthread_mutex는 의미 상으로 추상화 계층 아래의 Windows Mutex 또는 중요 섹션과 동일하게 만들 수 있습니다. 여기에 몇 가지 예외가 있지만 대부분의 사람들에게 이것은 사실입니다. Windows Events 나 POSIX 조건 변수를 다루는 사람이라면 추상화하기가 더 어렵습니다. (비스타는 POSIX 스타일의 조건 변수를 도입했지만 많은 Windows 소프트웨어 개발자가 Vista를 요구하는 위치에 있지는 않습니다 ...)
boost \ thread \ win32 \ basic_timed_mutex.hpp에서 보니 win32 스레딩 객체의 사용은 전혀 보이지 않습니다. 어쨌든 특수한 CPU 명령어를 사용하는 인터 로킹 된 메소드로 처리되는 것처럼 보입니다. –
연동 된 메서드는 일부 Win32 동기화 개체의 기초이기도합니다. 뮤텍스 또는 선택을 위해 실제로 필요한 모든 것입니다. – Blindy
인터록 된 메서드는 Win32 API의 일부이기도합니다. 상위 수준의 Win32 동기화 개체보다 이식성이 뛰어납니다. – jalf