mfc cmutex 예제

응용 프로그램이 리소스에 액세스하기 전에 어떤 일이 발생할 때까지 기다려야 합니까(예: 파일을 작성하기 전에 통신 포트에서 데이터를 수신해야 합니까)? 두 개 이상의 응용 프로그램에서 이 리소스를 사용할 수 있습니까(예: 리소스가 DLL에 있음)? 다중 스레드 환경에서 각 스레드에는 고유한 로컬 스레드 스택 및 레지스터가 있습니다. 여러 스레드가 읽기 및 쓰기를 위해 동일한 리소스에 액세스하는 경우 값이 올바른 값이 아닐 수 있습니다. 예를 들어 응용 프로그램에 파일에서 콘텐츠를 읽기 위한 스레드와 파일을 작성하는 스레드가 두 개의 스레드가 있다고 가정해 보겠습니다. 쓰기 스레드가 쓰기를 시도하고 읽기 스레드가 동일한 데이터를 읽으려고 하면 데이터가 손상될 수 있습니다. 이 경우 파일 액세스를 잠급하려고 합니다. 스레드 동기화에는 두 단계가 있습니다. 신호 및 비 신호. 뮤텍스는 한 번에 하나의 스레드만 데이터 또는 다른 제어 된 리소스를 수정할 수 있는 경우에 유용합니다. 예를 들어 연결된 목록에 노드를 추가하는 것은 한 번에 하나의 스레드에서만 허용해야 하는 프로세스입니다. CMutex 개체를 사용하여 연결된 목록을 제어하면 한 번에 하나의 스레드만 목록에 액세스할 수 있습니다.

사용할 동기화 액세스 클래스를 선택하는 것이 더 간단합니다. 응용 프로그램이 단일 제어 리소스에만 액세스하는 데 관심이 있는 경우 CSingleLock을 사용합니다. 제어된 여러 리소스 중 하나에 액세스해야 하는 경우 CMultiLock을 사용합니다. 예제 1에서 CSingleLock은 각각의 경우에 특정 시간에 하나의 리소스만 필요하기 때문에 사용되었을 것입니다. 동일한 응용 프로그램 내의 스레드가 한 번에 이 리소스에 액세스할 수 있습니까(예: 응용 프로그램에서 동일한 문서에 대한 뷰가 있는 창을 최대 5개까지 허용)? 이러한 방식으로 CMutex 개체에 의해 제어되는 리소스에 액세스하려면 먼저 리소스의 액세스 멤버 함수에서 CSingleLock 또는 CMultiLock 형식의 변수를 만듭니다. 그런 다음 잠금 개체의 Lock 멤버 함수(예: CSingleLock::Lock)를 호출합니다. 이 시점에서 스레드는 리소스에 대한 액세스 권한을 얻거나, 리소스가 해제될 때까지 기다렸다가 액세스 권한을 얻거나, 리소스가 해제되고 시간 시간이 지나갈 때까지 기다리며 리소스에 대한 액세스 권한을 얻지 못합니다. 어쨌든 리소스는 스레드에서 안전한 방식으로 액세스되었습니다. 리소스를 해제하려면 잠금 개체의 잠금 해제 멤버 함수(예: CSingleLock::Unlock)를 사용하거나 잠금 개체가 범위를 벗어나도록 허용합니다. CMutex 개체를 사용하는 다른 방법은 제어하려는 클래스에 CMutex 형식의 변수를 데이터 멤버로 추가하는 것입니다.

제어된 개체를 구성하는 동안 Mutex가 처음 소유되어 있는지 여부, 뮤텍스 이름(프로세스 경계를 넘어 사용되는 경우) 및 원하는 보안 특성을 지정하는 CMutex 데이터 멤버의 생성자에게 호출합니다. 첫째, GetDlgItem 방지 및 UpdateData 피하기에 대한 내 에세이를 이미 읽었을 수도 있는 분들을 위해 이것은 불꽃이 아닙니다. 이것은 경고입니다. 합리적인 사람들은 UpdateData에 대한 내 견해가 결함이 있다고 주장 할 수 있지만 GetDlgItem은 완벽한 의미가 있습니다. 이 에세이는 이러한 구문이 깨졌기 때문에 이러한 구문들을 피하라고 말합니다. 그들은 작동하지 않으며 작동 할 수 없습니다. 이를 사용하려고 하면 이해할 수 없는 버그가 발생할 수 있습니다. CreateMutex 함수는 뮤텍스 개체를 만드는 데 사용됩니다. CreateMutex 함수에서 명명된 Mutex 또는 이름 없는 뮤텍스를 초기화하고 소유권을 참 또는 거짓 인수로 설정합니다. 같은 이유로 CMutex가 끊어지므로 CEvent가 손상되었습니다. 프로세스 간에 명명된 이벤트를 사용할 수 없음을 포함합니다. MFC CEvent 클래스는 생성자에게 기본 인수를 제공합니다.

Geplaatst in Geen categorie door admin. Zet de link bij je favorieten link.