В моем коде я использую boost::threads
, и у меня есть класс, который запускает поток через функцию-член под названием fnThread()
.В этом fnThread () я хочу создать shared_from_this () и передать его прослушивающим сторонам с сигналом.Но строка boost::shared_ptr<foo> p = shared_from_this()
вызывает исключение следующим образом:
boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_weak_ptr> > at memory location 0x04c2f720.
Командой, вызывающей помехи, является shared_from_this ()Это незаконно, чтобы создать shared_from_this()
из другого потока, или я делаю что-то не так?Любая помощь приветствуется.Спасибо!
PS: я планирую изменить аргументы сигнала на простые указатели, поскольку это не повлияет на мою структуру.Но я предпочитаю shared_ptr <> и хочу услышать любые комментарии по поводу решения.Может быть, это плохой выбор для этой конкретной ситуации.Что вы предлагаете?
РЕДАКТИРОВАТЬ:
Вот простой класс для тестирования
class foo : public boost::enable_shared_from_this<foo>
{
public:
int start()
{
foo_thread.reset(new boost::thread(boost::bind(&foo::fn_foo_thread, this)));
return 0;
}
~foo()
{
if (foo_thread->joinable())
foo_thread->join();
}
private:
boost::scoped_ptr<boost::thread> foo_thread;
void fn_foo_thread()
{
boost::shared_ptr<foo> p = shared_from_this();
std::cout << "foo thread terminated. \n" << std::endl;
}
};