cmutex 예제

2019年8月2日

이 클래스중 어느 것도 잠금을 명시적으로 호출하거나 잠금을 해제할 필요가 없기 때문에 래핑하지 않고도 RAII의 이점을 얻을 수 없습니다. 예를 들어 부스트 뮤텍스 잠금을 사용하여 의사 코드의이 작은 비트를 가져 가라 … 상기 코드의 일반적인 출력은 ARGGGH 합계가 8140268이며 경주 조건이 있기 때문에 프로그램이 실행될 때마다 다른 합계가 인쇄됩니다. 코드는 두 스레드가 동시에 읽기 – 쓰기 합계를 중지하지 않습니다. 예를 들어 두 스레드모두 각 스레드를 실행하는 CPU에 sum의 현재 값을 복사합니다(123을 선택해 보겠습니다). 두 스레드 모두 복사본에 대해 하나씩 증분합니다. 두 스레드 모두 값(124)을 다시 씁니다. 스레드가 다른 시간에 합계에 액세스했다면 개수는 125였을 것입니다. 이 예제 응용 프로그램은 세 가지 유형의 동기화 클래스를 모두 사용합니다. 한 번에 최대 3개의 계정을 검사할 수 있으므로 CSemaphore를 사용하여 세 개의 뷰 개체에 대한 액세스를 제한합니다. 네 번째 계정을 보려는 시도가 발생하면 응용 프로그램은 처음 세 개의 창 중 하나가 닫히거나 실패할 때까지 기다립니다. 계정이 업데이트되면 응용 프로그램은 CCriticalSection을 사용하여 한 번에 하나의 계정만 업데이트되도록 합니다.

업데이트가 성공하면 CEvent를 신호하여 이벤트가 신호를 받을 때까지 기다리는 스레드를 해제합니다. 이 스레드는 새 데이터를 데이터 아카이브로 보냅니다. (고급 참고: 올바른 옵션으로 만들고 공유 메모리 세그먼트를 사용하는 경우 자식과 부모가 뮤텍스를 공유할 수 있도록 하는 공유 메모리를 사용하는 고급 옵션이 있습니다. stackoverflow 예제 참조) 동일한 응용 프로그램 내의 스레드가 한 번에 이 리소스에 액세스할 수 있습니까(예: 응용 프로그램에서 동일한 문서에 대한 뷰가 있는 최대 5개의 창을 허용)? 잠금이 하나만 있는 경우 불필요한 두 스레드 간의 잠금에 대한 중요한 경합이 있을 수 있습니다. 예를 들어 두 개의 스레드가 서로 다른 두 카운터를 업데이트하는 경우 동일한 잠금을 사용할 필요가 없을 수 있습니다. 두 개 이상의 응용 프로그램에서 이 리소스를 사용할 수 있습니까(예: 리소스가 DLL에 있음)? 사용할 동기화 액세스 클래스를 선택하는 것이 더 간단합니다. 응용 프로그램이 단일 제어 리소스에만 액세스하는 데 관심이 있는 경우 CSingleLock을 사용합니다. 제어된 여러 리소스 중 하나에 액세스해야 하는 경우 CMultiLock을 사용합니다. 예제 1에서 CSingleLock은 각각의 경우에 특정 시간에 하나의 리소스만 필요하기 때문에 사용되었을 것입니다. 간단한 예제에서 추가 해야 하는 코드의 가장 작은 양은 세 줄: 다중 스레드 환경에서 각 스레드에는 고유한 로컬 스레드 스택 및 레지스터가 있습니다.

여러 스레드가 읽기 및 쓰기를 위해 동일한 리소스에 액세스하는 경우 값이 올바른 값이 아닐 수 있습니다. 예를 들어 응용 프로그램에 파일에서 콘텐츠를 읽기 위한 스레드와 파일을 작성하는 스레드가 두 개의 스레드가 있다고 가정해 보겠습니다. 쓰기 스레드가 쓰기를 시도하고 읽기 스레드가 동일한 데이터를 읽으려고 하면 데이터가 손상될 수 있습니다. 이 경우 파일 액세스를 잠급하려고 합니다. 스레드 동기화에는 두 단계가 있습니다.

カテゴリー:未分類