Реферат: Критические секции
// но никогда его не освобождаем. Такудобнейдляотладки
static inline HANDLE _CriticalSectionGetEvent(LPCRITICAL_SECTION pcs)
{
HANDLE ret = pcs->LockSemaphore;
if (!ret)
{
HANDLE sem = ::CreateEvent(NULL, false, false, NULL);
ATLASSERT(sem);
if (!(ret = (HANDLE)::InterlockedCompareExchangePointer(
&pcs->LockSemaphore, sem, NULL)))
ret = sem;
else
::CloseHandle(sem); // Кто-то успел раньше
}
return ret;
}
// Ждем, пока критическая секция не освободится либо время ожидания
// будетпревышено
static inline VOID _WaitForCriticalSectionDbg(LPCRITICAL_SECTION pcs)
{
HANDLE sem = _CriticalSectionGetEvent(pcs);
DWORD dwWait;
do
{
dwWait = ::WaitForSingleObject(sem, DEADLOCK_TIMEOUT);
if (WAIT_TIMEOUT == dwWait)
{
ATLTRACE("Critical section timeout (%u msec):"
" tid 0x%04X owner tid 0x%04X\n", DEADLOCK_TIMEOUT,