Образовательный портал Claw.ru
Всё для учебы, работы и отдыха
» Шпаргалки, рефераты, курсовые
» Сочинения и изложения
» Конспекты и лекции
» Энциклопедии

Доступ к объекту по-прежнему синхронизован, но вызов SomeMethod(); происходит вне критической секции. Победа? Почти. Осталась одна маленькая деталь. Давайте посмотрим, что происходит в Proc2():

void Proc2(IObject *pNewObject)

{

  m_lockObject.Lock();

  if (m_pObject.p)

    m_pObject.p->Release();

  m_pObject.p = pNewobject;

  if (m_pObject.p)

    m_pObject.p->AddRef();

  m_lockObject.Unlock();

}

Очевидно, что вызовы m_pObject.p->AddRef(); и m_pObject.p->Release(); происходят внутри критической секции. И если вызов метода AddRef(), как правило, безвреден, то вызов метода Release() может оказаться последним вызовом Release(), и объект самоуничтожится. В методе FinalRelease() объекта №2 может быть все что угодно, например, освобождение объектов, живущих в других подразделениях. А это опять приведет к переключению ниток и может вызвать самоблокировку объекта №1 по уже известному сценарию. Придется воспользоваться той же техникой, что и в методе Proc1():

Листинг 13

// Нить №2

void Proc2(IObject *pNewObject)

{

  CComPtr<IObject> pPrevObject;

  m_lockObject.Lock();


Рекомендуем скачать другие рефераты по теме: реферат на экономическую тему, инновационная деятельность.


Категории:




Предыдущая страница реферата | 9  10  11  12  13  14  15  16  17  18  19 |


Поделитесь этой записью или добавьте в закладки

   



Рефераты от А до Я