shared_from_this () из другого потока (функция-член потока) - PullRequest
2 голосов
/ 21 января 2011

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

Ответы [ 4 ]

4 голосов
/ 22 января 2011

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

2 голосов
/ 08 апреля 2016

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

0 голосов
/ 30 января 2018

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

0 голосов
/ 21 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...