Синхронизация для обсервера
От: s_viy  
Дата: 18.09.07 08:53
Оценка:
Приветствую! Собственно интересует общая стратегия синхронизация двух
связных объектов. Вот пример псевдо-кода для обсервера:

struct iobserver
{
  virtual void update() = 0;
  virtual void release() = 0;
};

struct isubject
{
  virtual void method() = 0;
  virtual void erase(iobserver*) = 0;
};

struct subject: isubject
{
  mutex _m;
  iobserver* _observer;
  virtual void method()
  {
    mutex::scoped_lock sl(_m);
    _observer->update();
  }
  virtual void erase(iobserver* observer)
  {
    mutex::scoped_lock sl(_m);
    _observer = 0;
  }
};

struct observer: iobserver
{
  mutex _m;
  isubject* _subject;
  virtual void update()
  {
    mutex::scoped_lock sl(_m);
    this->release();
  };

  virtual void release()
  {
    mutex::scoped_lock sl(_m);
    _subject->erase(this);
  };
};


Добустим из одного потока вызывается method субъекта, который
вызывает метод update обсервера, в результате его выполнения
обсервер решает, что больше он не нужен и вызывает метод release
где призводит все необходимые операции и отписывается от субъекта.
В это время из другого потока, также происходит вызов метода
release() обсервера. Если этот вызов происходит после вызова
update(), но до вызова release() из update(), то на методе
erase() возникает деадлок. Интересует, как эту проблему можно
элегантно решить?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.