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

if (0x80000000 & dwSpinCount)

_CriticalSectionGetEvent(pcs);

}

DWORD SetCriticalSectionSpinCount(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount);

Устанавливает значение поля SpinCount и возвращает его предыдущее значение. Напоминаю, что старший бит отвечает за "привязку" события, используемого для ожидания доступа к данной критической секции.

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

DWORD RtlSetCriticalSectionSpinCount(

LPRTL_CRITICAL_SECTION pcs, DWORD dwSpinCount)

{

DWORD dwRet = pcs->SpinCount;

pcs->SpinCount = dwSpinCount;

return dwRet;

}

VOID DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

Освобождает ресурсы, занимаемые критической секцией.

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

VOID RtlDeleteCriticalSection(LPRTL_CRITICAL_SECTION pcs)

{

pcs->DebugInfo = NULL;

pcs->LockCount = -1;

pcs->RecursionCount = 0;

pcs->OwningThread = 0;

if (pcs->LockSemaphore)

{

::CloseHandle(pcs->LockSemaphore);

pcs->LockSemaphore = NULL;

}

}

VOID EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

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