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

inline VOID LeaveCriticalSectionDbg(LPCRITICAL_SECTION_DBG pcs)

{

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

// с идентификатором нити-влядельца.

// Если это не так, скорее всего мы имеем дело с ошибкой

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

if (--pcs->RecursionCount)

{

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

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

::InterlockedDecrement(&pcs->LockCount);

}

else

{

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

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

ATLASSERT(NULL != pcs->OwningThread);

pcs->OwningThread = NULL;

pcs->m_nLine = 0;

pcs->m_azFile = NULL;

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

{

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

_UnWaitCriticalSectionDbg(pcs);

}

}

}

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

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

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