Здравствуйте.
Читал в разных местах, что с одной стороны использование 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?