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

};

typedef struct CRITICAL_SECTION_DBG *LPCRITICAL_SECTION_DBG;

// Создаем на лету событие для операций ожидания,

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

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_DBG pcs

, int nLine, LPCSTR azFile)

{

HANDLE sem = _CriticalSectionGetEvent(pcs);

DWORD dwWait;

do

{

dwWait = ::WaitForSingleObject(sem, DEADLOCK_TIMEOUT);

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