Критические секции
Категория реферата: Рефераты по информатике, программированию
Теги реферата: бесплатно решебник, рефераты на украинском языке
Добавил(а) на сайт: Сыровой.
Предыдущая страница реферата | 16 17 18 19 20 21 22 23 24 25 26 | Следующая страница реферата
// Придется подождать
_WaitForCriticalSectionDbg(pcs, nLine, azFile);
}
// Либо критическая секция была "свободна",
// либо мы дождались. Сохраняем идентификатор текущей нити.
pcs->OwningThread = (HANDLE)::GetCurrentThreadId();
pcs->RecursionCount = 1;
pcs->m_nLine = nLine;
pcs->m_azFile = azFile;
}
// Заполучаем критическую секцию, если она никем не занята
inline BOOL TryEnterCriticalSectionDbg(LPCRITICAL_SECTION_DBG pcs
, int nLine, LPSTR azFile)
{
if (-1L == ::InterlockedCompareExchange(&pcs->LockCount, 0, -1))
{
// Это первое обращение к критической секции
pcs->OwningThread = (HANDLE)::GetCurrentThreadId();
pcs->RecursionCount = 1;
pcs->m_nLine = nLine;
pcs->m_azFile = azFile;
}
else if (pcs->OwningThread == (HANDLE)::GetCurrentThreadId())
{
// Это не первое обращение, но из той же нити
::InterlockedIncrement(&pcs->LockCount);
pcs->RecursionCount++;
}
else
return FALSE; // Критическая секция занята другой нитью
return TRUE;
}
// Освобождаем критическую секцию
inline VOID LeaveCriticalSectionDbg(LPCRITICAL_SECTION_DBG pcs)
{
// Проверяем, чтобы идентификатор текущей нити совпадал
// с идентификатором нити-влядельца.
// Если это не так, скорее всего мы имеем дело с ошибкой
ATLASSERT(pcs->OwningThread == (HANDLE)::GetCurrentThreadId());
if (--pcs->RecursionCount)
{
// Не последний вызов из этой нити.
// Уменьшаем значение поля LockCount
::InterlockedDecrement(&pcs->LockCount);
}
else
{
// Последний вызов. Нужно "разбудить" какую-либо
// из ожидающих ниток, если таковые имеются
ATLASSERT(NULL != pcs->OwningThread);
Рекомендуем скачать другие рефераты по теме: реферат на экономическую тему, инновационная деятельность.
Предыдущая страница реферата | 16 17 18 19 20 21 22 23 24 25 26 | Следующая страница реферата