응용 프로그램이 리소스에 액세스하기 전에 어떤 일이 발생할 때까지 기다려야 합니까(예: 파일을 작성하기 전에 통신 포트에서 데이터를 수신해야 합니까)? 적어도 변수증설과 비교하여 뮤텍스를 백만 번 잠그고 잠금을 해제하기 때문에 이 프로세스가 느리게 실행됩니다. (그리고이 간단한 예에서 우리는 정말 스레드가 필요하지 않았다 – 우리는 두 번 추가 할 수 있습니다!) 더 빠른 다중 스레드 예제는 자동(local) 변수를 사용하여 백만 개를 추가한 다음 계산 루프가 완료된 후에만 공유 합계에 추가하는 것입니다. 응용 프로그램이 단일 제어 리소스에만 액세스하는 데 관심이 있는 경우 CSingleLock을 사용합니다. 제어된 여러 리소스 중 하나에 액세스해야 하는 경우 CMultiLock을 사용합니다. 예제 1에서 CSingleLock은 각각의 경우에 특정 시간에 하나의 리소스만 필요하기 때문에 사용되었을 것입니다. 이러한 방식으로 CMutex 개체에 의해 제어되는 리소스에 액세스하려면 먼저 리소스의 액세스 멤버 함수에서 CSingleLock 또는 CMultiLock 형식의 변수를 만듭니다. 그런 다음 잠금 개체의 Lock 멤버 함수(예: CSingleLock::Lock)를 호출합니다. 이 시점에서 스레드는 리소스에 대한 액세스 권한을 얻거나, 리소스가 해제될 때까지 기다렸다가 액세스 권한을 얻거나, 리소스가 해제되고 시간 시간이 지나갈 때까지 기다리며 리소스에 대한 액세스 권한을 얻지 못합니다. 어쨌든 리소스는 스레드에서 안전한 방식으로 액세스되었습니다.

리소스를 해제하려면 잠금 개체의 잠금 해제 멤버 함수(예: CSingleLock::Unlock)를 사용하거나 잠금 개체가 범위를 벗어나도록 허용합니다. 동일한 응용 프로그램 내의 스레드가 한 번에 이 리소스에 액세스할 수 있습니까(예: 응용 프로그램에서 동일한 문서에 대한 뷰가 있는 창을 최대 5개까지 허용)? 예를 들어 연결된 계정 목록을 유지하는 응용 프로그램을 예로 들어 보겠습니다. 이 응용 프로그램은 별도의 창에서 최대 세 개의 계정을 검사 할 수 있지만, 하나만 특정 시간에 업데이트 할 수 있습니다. 계정이 업데이트되면 업데이트된 데이터가 네트워크를 통해 데이터 아카이브로 전송됩니다. 이제 구현이 다소 깨지거나 부스트와 같은 다른 라이브러리보다 매우 열등하기 때문에 CMutex, CCritalSection, CSemaphore 및 CEvent를 피해야한다고 주장합니다. 예를 들어 다중 스레드 환경에서 각 스레드에는 고유한 로컬 스레드 스택 및 레지스터가 있습니다. 여러 스레드가 읽기 및 쓰기를 위해 동일한 리소스에 액세스하는 경우 값이 올바른 값이 아닐 수 있습니다. 예를 들어 응용 프로그램에 파일에서 콘텐츠를 읽기 위한 스레드와 파일을 작성하는 스레드가 두 개의 스레드가 있다고 가정해 보겠습니다. 쓰기 스레드가 쓰기를 시도하고 읽기 스레드가 동일한 데이터를 읽으려고 하면 데이터가 손상될 수 있습니다.

이 경우 파일 액세스를 잠급하려고 합니다. 스레드 동기화에는 두 단계가 있습니다. 신호 및 비 신호.

cmutex 예제