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

// Проверяем, чтобы не было удалений "захваченных" критических секций

ATLASSERT(0 == pcs->m_nLine && NULL == pcs->m_azFile);

// Остальное доделает система

DeleteCriticalSection(pcs);

}

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

inline VOID EnterCriticalSectionDbg(LPCRITICAL_SECTION_DBG pcs

, int nLine, LPSTR azFile)

{

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

{

// LockCount стал больше нуля.

// Проверяем идентификатор нити

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

{

// Нить та же самая. Критическая секция наша.

// Никаких дополнительных действий не производим.

// Это не совсем верно, так как возможно, что непарный

// вызов ::LeaveCriticalSection() был сделан на n-ном заходе,

// и это придется отлавливать вручную, но реализация

// стека для __LINE__ и __FILE__ сделает нашу систему

// более громоздкой. Если это действительно необходимо,

// вы всегда можете сделать это самостоятельно

pcs->RecursionCount++;

return;

}

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

// Придется подождать

_WaitForCriticalSectionDbg(pcs, nLine, azFile);

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