나는이 기사가 CSingleLock의 근본적인 오해와 그것을 어떻게 사용하는지에 근거한다고 생각한다.
동일한 CSingleLock을 여러 번 잠글 수는 없지만 그렇게 할 수는 없습니다. 이름에서 알 수 있듯이 CSingleLock은 한 번만 잠금을 설정하기위한 것입니다.
각 CSingleLock은 CSingleLock이 범위를 벗어날 때 자동으로 해당 잠금을 해제하기위한 목적으로 다른 일부 개체 (예 : 제작 중에 전달하는 CCriticalSection)에 대해 하나의 잠금을 관리합니다.
기본 개체를 여러 번 잠 그려면 여러 개의 CSingleLocks를 사용하십시오. 당신은 하나의 CSingleLock을 사용하지 않고 그것을 여러 번 시도하려고합니다.
잘못된 (그의 예) :
CCriticalSection crit;
CSingleLock lock(&crit);
lock.Lock();
lock.Lock();
lock.Unlock();
lock.Unlock();
오른쪽 :
CCriticalSection crit;
CSingleLock lock1(&crit);
CSingleLock lock2(&crit);
lock1.Lock();
lock2.Lock();
lock2.Unlock();
lock1.Unlock();
더 좋은 (그래서 당신은 RAII를 얻을) :
CCriticalSection crit;
// Scope the objects
{
CSingleLock lock1(&crit, TRUE); // TRUE means it (tries to) locks immediately.
// Do stuff which needs the lock (if IsLocked returns success)
CSingleLock lock2(&crit, TRUE);
// Do stuff which needs the lock (if IsLocked returns success)
}
// crit is unlocked now.
(물론, 의도적 않을 것 그런 단일 블록에서 동일한 기본 임계 섹션에 두 개의 잠금을 얻습니다. 일반적으로 호출의 결과로만 발생합니다. (자체 잠금이 이미있는 다른 내부에있는 동안 잠금을 얻는) 함수를 사용해야합니다.
(잠금을 성공적으로 수행했는지 확인하려면 CSingleLock.IsLocked를 확인해야합니다. 그 체크를 간략하게하기 위해, 그리고 그들은 원래의 예제에서 빠졌기 때문에 떠났다.)
CCriticalSection 그 자체가 똑같은 문제로 고통받는다면 그것은 분명히 문제가된다.하지만 그는 내가 볼 수 있습니다. (어쩌면 내가 뭔가 놓친. 그 방법을 확인하려면 내 MFC 설치 CCriticalSection 소스를 찾을 수 없습니다.)
자물쇠가 무엇을 해야하는지에 대한 그의 이해는 컴 - sci 배경을 기반으로 것 같습니다 다른 플랫폼 및/또는 구현과 비슷한 이름의 자물쇠 구현 등이 포함됩니다. – Arafangion
그는 CSingleLock을 중요한 섹션 자체로 착각했습니다. CSingleLock은 전체 중요 섹션이 아닌 하나의 잠금을 관리합니다 (RAII를 제공합니다). –
아하, +1. :) – Arafangion