В моем коде я использую boost::threads
, и у меня есть класс, который запускает поток через функцию-член, которая называется fnThread()
. В этом fnThread() я хочу создать shared_from_this() и передать его прослушивающим сторонам с сигналом. Но строка boost::shared_ptr<foo> p = shared_from_this()
выдает исключение следующим образом;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 <>, и я хочу услышать любые комментарии относительно решения. Может быть, это плохой выбор для этой конкретной ситуации. Что ты предлагаешь ?
EDIT:
Вот простой класс для тестирования
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;
}
};
Что значит «создать« shared_from_this() »?? –
Я имею в виду получить 'boost :: shared_ptr' to 'this' –
fgungor
Пожалуйста, покажите нам код, который запускает 'foo' и вызывает' start'. Вероятно, ошибка. – Macke