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