2011-01-21 4 views
2

В моем коде я использую 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; 
    } 
}; 
+0

Что значит «создать« shared_from_this() »?? –

+0

Я имею в виду получить 'boost :: shared_ptr ' to 'this' – fgungor

+1

Пожалуйста, покажите нам код, который запускает 'foo' и вызывает' start'. Вероятно, ошибка. – Macke

ответ

0

Вы можете, как рассмотреть вопрос об изменении boost::shared_ptr<> в boost::intrusive_ptr<>. Основное отличие состоит в том, что boost::intrusive_ptr<> предполагает, что опорный счетчик хранится внутри объекта (хотя его можно сохранить в другом месте). С встроенным счетчиком ссылок вы можете построить boost::intrusive_ptr<> из этого в конструкторе или из простого указателя, когда захотите (но не принимайте boost::intrusive_ptr<> от этого в деструкторе).

4

shared_from_this может быть использован из другой нити. Исключение bad_weak_ptr бросается, когда нет shared_ptr до this (как следует из названия). Скорее всего, ваша проблема существует в другом месте вашего кода.

+0

Как насчет вызова 'shared_from_this' объекта из нескольких потоков одновременно? – updogliu

+1

'shared_from_this' является потокобезопасным. –

2

Как уже упоминалось @Sam Miller, проблема существует в другом месте. Я могу представить, что вы объявили fooscoped_ptr<foo>. Таким образом, для shared_from_this невозможно вернуть действительный общий указатель, потому что умный указатель типа boost::scoped_ptr не может передать право собственности на объект. Вот причина вашего исключения.

0

shared_from_this() не может быть вызван до завершения конструктора или после запуска деструктора.

Смежные вопросы