2010-12-06 3 views
3

우리는 MFC에서 몇 가지 초보자이며 우리는 멀티 - threded 응용 프로그램을 구축하고 있습니다. 우리는 CCriticalSection을 구현하지 않아서 사용하지 말 것을 경고하는 URL의 기사를 보게됩니다. 우리는 누구든지 CCriticalSection을 사용하는 데 어떤 경험이 있는지 알고 당신이 어떤 문제 또는 버그를 건너 오는지 알고 관심이 있습니까? VC++ 2008을 사용하여 응용 프로그램을 빌드하는 경우 CCriticalSection을 사용할 수 있고 프로덕션 준비가 되었습니까?은 제작시 Ccriticalsection을 사용할 수 있습니까?

http://www.flounder.com/avoid_mfc_syncrhonization.htm

들으

답변

11

나는이 기사가 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 소스를 찾을 수 없습니다.)

+0

자물쇠가 무엇을 해야하는지에 대한 그의 이해는 컴 - sci 배경을 기반으로 것 같습니다 다른 플랫폼 및/또는 구현과 비슷한 이름의 자물쇠 구현 등이 포함됩니다. – Arafangion

+1

그는 CSingleLock을 중요한 섹션 자체로 착각했습니다. CSingleLock은 전체 중요 섹션이 아닌 하나의 잠금을 관리합니다 (RAII를 제공합니다). –

+0

아하, +1. :) – Arafangion

0

그 문서는 그 구현이 그들에게 기대해야 할 의미를 위반하는 것을 제외하고 그 프리미티브를 사용하는 간단한 상황, 좋은 것을 제안한다.

기본적으로, 비 반복적 잠금으로 사용하는 경우, 잠금이 항상 유효하도록 (즉, 포기되지 않도록)주의를 기울이는 것이 좋습니다.

그러나 제한 사항은 용서할 수 없다고 불평합니다.

관련 문제