Реферат: Критические секции

// но никогда его не освобождаем. Такудобнейдляотладки

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,

К-во Просмотров: 770
Бесплатно скачать Реферат: Критические секции