2015-09-14 2 views
0

Я использую boost::asio::io_service для обработки работы в Foo. Теперь это работает нормально, пока я не выйду из ~Foo и не найду где-нибудь в io_service деструктор (в деструкторе service_registry). Я что-то не так?io_service висит на разрушении

struct Foo { 
    Foo(); 
    ~Foo(); 
    void bar(); 
    boost::asio::io_service _ioService; 
    unique_ptr<boost::asio::io_service::work> _ioWork; 
    thread _thread; 
}; 

Foo::Foo() : 
    _ioWork(new boost::asio::io_service::work(_ioService)), 
    _thread([&]() { 
     _ioService.run(); 
    }) { 
} 

Foo::~Foo() { 
    _ioWork.release(); 
    _ioService.stop(); 
    _thread.join(); 
    // works great till here 
} 

void 
Foo::bar() { 
    auto writer = []() 
    { 
     // Some magic code 
    }; 

    _ioService.post(writer); 
} 

Я вроде удивления, почему _thread не присоединится, когда я не называю stop на _ioService.

+1

Прикрепите свой отладчик и узнайте, что блокирует ... –

ответ

2

Не звоните _ioWork.release() (или после звонка release, удалите указатель, который вы получите).

Вот что документация говорит о release:

Релизы собственности управляемого объекта, если таковые имеются. get() возвращает nullptr после вызова.

В вашем коде, ваш объект _ioWork просочится; это, вероятно, то, что заставляет ваш ioService повесить.

+0

Это AFAIU - предпочтительный способ поддержания обслуживания. – abergmeier

+2

Но ваша проблема в том, что служба не перестанет работать. Вы продолжаете работать, не удаляя объект io_service :: work. – Fsmv

+0

Ах спасибо, путал 'release' с' reset'. – abergmeier

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