Реферат: Критические секции
};
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);