Реферат: Блокировки в 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
|