Снова this в конструкторе
От: found Россия ak239.ru
Дата: 01.03.12 19:19
Оценка:
Здравствуйте.

Читал в разных местах, что с одной стороны использование this в конструкторе — нормальная практика, с другой стороны нет.
Опишу задачу упрощенно: при конструировании объекта создать, связанный с ним поток, использующий некоторые поля объекта.
Пример:

struct Foo
{
  Foo() : data(0)
  {
    CreateThread(..., Starter, this, ...);
  }

  static int Starter(void* obj)
  {
    static_cast<Foo*>(obj)->run();
  }

  void run()
  {
    m_Data++;
  }

  int m_Data;
}


Можно ли поступать подобным образом? Передавать this во внешнюю функцию, которая вызывает статическую функцию с этим параметром, далее относительно него запускать функцию член.

Реальная задача:
Внутри объекта хранится объект — событие и ссылка на внешнее событие. В конструкторе необходимо запустить поток, в котором сигнализировать событием объекта и остановиться в ожидании внешнего события.
В итоге происходит следующая последовательность действий:
1. В конструкторе создается объект событие
2. В конструкторе создается поток, приемом описанным выше
3. Внутри функции потока событие объекта устанавливается в сигнальное состояние
4. Функция потока останавливается в ожидании внешнего события

Как правило, приведенная схема работает. Но когда потоков становится действительно много, иногда возникает ситуация, когда пункт 3 алгоритма приводит к ошибке обращения к памяти, при чем с помощью отладчика, удалось выяснить, что неверен не только объект внутреннего события, но и все остальные поля класса, из чего я делаю вывод, что неверен указатель this, относительно которого вызывается функция член класса.

В чем может быть реальная проблема в пункте 3?
this в конструторе
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.