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

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

pcs->RecursionCount = 1;

}

// Заполучаем критическую секцию, если она никем не занята

inline BOOL TryEnterCriticalSectionDbg(LPCRITICAL_SECTION pcs)

{

if (-1L == ::InterlockedCompareExchange(&pcs->LockCount, 0, -1))

{

// Это первое обращение к критической секции

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

pcs->RecursionCount = 1;

}

else if (pcs->OwningThread == (HANDLE)::GetCurrentThreadId())

{

// Это не первое обращение, но из той же нити

::InterlockedIncrement(&pcs->LockCount);

pcs->RecursionCount++;

}

else

return FALSE; // Критическая секция занята другой нитью

return TRUE;

}

// Освобождаемкритическуюсекцию

inline VOID LeaveCriticalSectionDbg(LPCRITICAL_SECTION pcs)

{

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

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

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

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

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