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

parent->RequestExclusive(_level);

if (!fUpd)

_value = parent->value;

parent->value = i;

fUpd = true;

}

int CProxy::get_Value(int level) const

{

if (level == -1)

level = _level;

parent->RequestShared(level);

int v = parent->value;

parent->RemoveShared(level);

return v;

}

Клиент никогда не имеет дела непосредственно с экземпляром класса CObject. Экземпляры класса CProxy – представляют копию данных объекта CObject и делегируют запросы на чтение и запись переменной value. Код получился несколько громоздким: к чему такие сложности? Я заранее определил довольно широкий интерфейс, чтобы потом меньше исправлять. :)

Прошу обратить внимание на довольно сложный механизм создания экземпляра CObject в функции GetObject. Обычно в программах используется более простой код, типа:

CProxy& CObject::GetObject(int level)

{

static CObject obj;

return obj.BeginTran(level);

}

Чем он плох? Дело в том, что если несколько потоков попытаются одновременно вызвать функцию GetObject, конструктор класса CObject может быть вызван более одного раза, так как компилятор (возможно, это его ошибка) не генерирует безопасный код проверки с использованием ассемблерной инструкции cmpxchg. Хотя вероятность возникновения такой ситуации довольно низка, я рекомендую все же не игнорировать ее. Самое простое решение проблемы заключается в использовании недорогого ресурса критической секции, например, так:

CProxy& CObject::GetObject(int level)

{

::EnterCriticalSection(&g_cs);

static CObject obj;

::LeaveCriticalSection(&g_cs);

return obj.BeginTran(level);

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