Реферат: Критические секции
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);