Реферат: Блокировки в MS SQL Server 2000

InitializeCriticalSection(&exclusive);

}

void TestExclusive()

{

//Проверка на монопольную блокировку

EnterCriticalSection(&exclusive);

//Вошлибольшеодногораза

if (exclusive.RecursionCount > 1)

LeaveCriticalSection(&exclusive);

}

void RemoveAllLocks()

{

//Если была установлена монопольная блокировка - снимаем

if (exclusive.OwningThread == (HANDLE)GetCurrentThreadId())

LeaveCriticalSection(&exclusive);

}

int value;

CRITICAL_SECTION exclusive;

static HANDLE hMutex;

};

Добавленный код выделен. Хочется пояснить одну деталь: так как изменять значение переменной value можно несколько раз, а Commit (или Rollback) вызывать только раз, налицо тот факт, что функция EnterCriticalSection вызывается бОльшее количество раз, нежели LeaveCriticalSection. Это ошибка – в соответствии с документацией количество вызовов функций EnterCriticalSection и LeaveCriticalSection должно совпадать. Поэтому после входа в критическую секцию я проверяю поле RecursionCount, которое устанавливает количество повторных входов потока в критическую секцию.

ПРИМЕЧАНИЕ

При работе под ОС семейства Windows 9x это поле не используется и всегда содержит 0, так что приводимый здесь и далее код будет работать только на операционных системах семейства NT.

Теперь можно определенно сказать, что выведется на консоль в следующем примере:

unsigned __stdcall thread_proc(void*)

{

// Началовторойтранзакции

CProxy& prx = CObject::GetObject(CObject::READ_UNCOMMITTED);

// Здесь поток будет ожидать примерно 1 сек. До тех пор, пока

К-во Просмотров: 980
Бесплатно скачать Реферат: Блокировки в MS SQL Server 2000