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

Осуществляют "захват" критической секции. Если критическая секция занята другой нитью, то ::EnterCriticalSection() будет ждать, пока та освободится, а ::TryEnterCriticalSection() вернет FALSE. Отсутствует в Windows 9x/ME.

Листинг 4. Псевдокод RtlEnterCriticalSection из ntdll.dll

VOID RtlEnterCriticalSection(LPRTL_CRITICAL_SECTION pcs)

{

if (::InterlockedIncrement(&pcs->LockCount))

{

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

{

pcs->RecursionCount++;

return;

}

RtlpWaitForCriticalSection(pcs);

}

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

pcs->RecursionCount = 1;

}

BOOL RtlTryEnterCriticalSection(LPRTL_CRITICAL_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

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