csinglelock 예제

클래스 CCriticalSection의 개체는 “중요 섹션”-한 번에 하나의 스레드가 리소스 또는 코드 섹션에 액세스할 수 있는 동기화 개체를 나타냅니다. 중요한 섹션은 한 번에 하나의 스레드만 데이터 또는 다른 제어된 리소스를 수정할 수 있는 경우에 유용합니다. 예를 들어 연결된 목록에 노드를 추가하는 것은 한 번에 하나의 스레드에서만 허용해야 하는 프로세스입니다. CCriticalSection 개체를 사용하여 연결된 목록을 제어하면 한 번에 하나의 스레드만 목록에 액세스할 수 있습니다. 이러한 방식으로 CCriticalSection 개체에 의해 제어되는 리소스에 액세스하려면 먼저 리소스의 액세스 멤버 함수에서 CSingleLock 형식의 변수를 만듭니다. 그런 다음 잠금 개체의 Lock 멤버 함수(예: CSingleLock::Lock)를 호출합니다. 이 시점에서 스레드는 리소스에 대한 액세스 권한을 얻거나, 리소스가 해제될 때까지 기다렸다가 액세스 권한을 얻거나, 리소스가 해제되고 시간 시간이 지나갈 때까지 기다리며 리소스에 대한 액세스 권한을 얻지 못합니다. 어쨌든 리소스는 스레드에서 안전한 방식으로 액세스되었습니다. 리소스를 해제하려면 잠금 개체의 잠금 해제 멤버 함수(예: CSingleLock::Unlock)를 사용하거나 잠금 개체가 범위를 벗어나도록 허용합니다. Csinglelock 잠금 (&mutex, true); / ////,/,/,/,/,/,/,/,/,unlocks.unlocks.unlocks.unlocks. 여러 스레드가 읽기 및 쓰기를 위해 동일한 리소스에 액세스하는 경우 값이 올바른 값이 아닐 수 있습니다. 예를 들어 응용 프로그램에 파일에서 콘텐츠를 읽기 위한 스레드와 파일을 작성하는 스레드가 두 개의 스레드가 있다고 가정해 보겠습니다. 쓰기 스레드가 쓰기를 시도하고 읽기 스레드가 동일한 데이터를 읽으려고 하면 데이터가 손상될 수 있습니다.

이 경우 파일 액세스를 잠급하려고 합니다. 스레드 동기화에는 두 단계가 있습니다. 신호 및 비 신호. 위에서 보여 주는 예제의 문제는 인간이 종종 읽기를 기대하는 내용을 읽기 때문에 그들을 찾는 것이 어렵다는 것입니다 (이것은 우리가 모양과 텍스트를 처리하는 방법에 내장 된 예측 패턴 인식의 일부입니다). 결과적으로 오류가 바로 보고 표시되지 않을 수 있지만 다음에 코드에 올 때 오류가 표시 될 수 있습니다 (그것에 대해 모두 잊어 버렸습니다). 다음 예제에서는 CSingleLock을 사용하여 작성된 동일한 함수를 보여 주며, 이는 자동으로 잠겨 있고, 필요한 직전에 만들어지고 함수의 끝에서 자동으로 소멸됩니다. 임계 섹션 대신 뮤텍스를 사용할 수 있습니다. 그러나 중요한 섹션 스레드 동기화 개체는 다른 동기화 개체에 비해 약간 빠릅니다. 임계 섹션 개체는 프로세스 내의 스레드를 동기화합니다. 임계 섹션에서는 한 번에 하나의 스레드만 액세스할 수 있습니다. 세마포를 조작하는 루프가 있는 경우 작동할 수 없습니다.

CSyncObject::Lock의 잘못된 구현을 감안할 때 불가능한 각 반복에서 세마포를 잠그려고 합니다. 그리고 같은 세마포를 사용하는 두 번째 스레드가 두 번 이상 잠금을 해제하는 것은 불가능합니다! 이벤트는 신호 상태 또는 비신호 상태를 설정하는 스레드 동기화 개체입니다. 이벤트에는 두 가지 유형이 있습니다.

liftdivision