Реферат: Критические секции
}
}while(WAIT_TIMEOUT == dwWait);
ATLASSERT(WAIT_OBJECT_0 == dwWait);
}
// Выставляем событие в активное состояние
static inline VOID _UnWaitCriticalSectionDbg(LPCRITICAL_SECTION pcs)
{
HANDLE sem = _CriticalSectionGetEvent(pcs);
BOOL b = ::SetEvent(sem);
ATLASSERT(b);
}
// Заполучаем критическую секцию в свое пользование
inline VOID EnterCriticalSectionDbg(LPCRITICAL_SECTION pcs)
{
if (::InterlockedIncrement(&pcs->LockCount))
{
// LockCount сталбольшенуля.
// Проверяемидентификаторнити
if (pcs->OwningThread == (HANDLE)::GetCurrentThreadId())
{
// Нить та же самая. Критическая секция наша.
pcs->RecursionCount++;
return;
}
// Критическая секция занята другой нитью.
// Придется подождать
_WaitForCriticalSectionDbg(pcs);
}
// Либо критическая секция была "свободна",