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

{

// Не последний вызов из этой нити.

// Уменьшаем значение поля LockCount

::InterlockedDecrement(&pcs->LockCount);

}

else

{

// Последний вызов. Нужно "разбудить" какую-либо

// из ожидающих ниток, если таковые имеются

ATLASSERT(NULL != pcs->OwningThread);

pcs->OwningThread = NULL;

if (::InterlockedDecrement(&pcs->LockCount) >= 0)

{

// Имеется, какминимум, однаожидающаянить

_UnWaitCriticalSectionDbg(pcs);

}

}

}

// Удостоверяемся, что ::EnterCriticalSection() былавызвана

// довызоваэтогометода

inline BOOL CheckCriticalSection(LPCRITICAL_SECTION pcs)

{

return pcs->LockCount >= 0

&& pcs->OwningThread == (HANDLE)::GetCurrentThreadId();

}

// Переопределяем все функции для работы с критическими секциями.

// Определение класса CLock должно быть после этих строк

#define EnterCriticalSection EnterCriticalSectionDbg

#define TryEnterCriticalSection TryEnterCriticalSectionDbg

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