자바가 어떻게 동작하는지 모르겠지만 .NET은 뮤텍스 (또는 아날로그 -이 구조를 "syncblk"라고 부르는 구조체)를 객체에 직접 저장하지 않습니다. 오히려, 그것은 syncblks의 전역 테이블을 가지고 있으며, 객체는 그 테이블의 인덱스에 의해 syncblk를 참조합니다. 게다가 객체는 생성하자마자 동기 블록을 얻지 못합니다. 대신 객체는 첫 번째 잠금에서 필요할 때 생성됩니다.
내가 가정 (참고, 나는 그것이 실제로 어떻게하는지 몰라!)는 스레드 안전한 방법으로 개체와 개체의 syncblk 연결하는 원자 비교 및 교환을 사용 :
- 확인 숨겨진
syncblk_index
0에 대한 객체의 필드입니다. 0이 아니면 잠금을 설정하고 계속합니다. 그렇지 않으면 ...
- 글로벌 테이블에서 새 syncblk을 만들고 인덱스를 가져옵니다 (글로벌 잠금은 필요에 따라 여기에서 획득/릴리스됩니다).).
- 개체 자체에 쓰기 및 쓰기를 비교 및 교환합니다.
- 이전 값이 0 인 경우 (0은 유효한 색인이 아니며 객체의 숨겨진
syncblk_index
필드의 초기 값임), syncblk 생성에 대한 논쟁은 없습니다. 잠그고 계속하십시오.
- 이전 값이 0이 아니라면 다른 누군가가 이미 syncblk를 만들고이를 생성하는 동안 그 객체와 연관 지어 왔고 이제 우리는 그 syncblk의 색인을 갖게되었습니다. 방금 작성한 방폐 물을 버리고 획득 한 방패를 잠급니다.
따라서 개체 당 오버 헤드는 4 최상의 경우 (syncblk 테이블에 32 비트 인덱스를 가정) 바이트, 실제로 고정 된 개체 크다. 객체를 거의 잠그지 않으면이 스킴은 리소스 사용을 줄이는 좋은 방법입니다. 그러나 대부분의 또는 모든 객체를 잠글 필요가 있다면 객체 내에 직접 뮤텍스를 저장하는 것이 더 빠를 수도 있습니다.
C++의 스레딩은 플랫폼에 따라 다르므로 어떤 플랫폼을 사용할지 지정할 수 있습니다. pthread를 사용하는 솔루션은 Win32 동기화 기능을 사용하는 솔루션과 다릅니다. –
그럼 모든 주요 플랫폼 - MacOSX, Solaris, Windows, Linux. – Lothar