Vertex
Vertex

Reputation: 2712

Keep io_service alive

My prefered way to use an io_service is to create a thread on application start that executes the io_service's run method. The problem is, if there is no task for io_service, its run method returns immediately and the thread terminates.

As you can see from the chat_client.cpp

...
boost::asio::io_service io_service;
...
chat_client c(io_service, iterator);
boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service));

the thread is started after some async task is added to io_service. This is done in the chat_clients's constructor.

My question is: Is there a way to create the thread before some task is added to io_service, i. e.

// create io_service and thread on application start
boost::asio::io_service io_service;
boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service));
// add some task to io_service
chat_client c(io_service, iterator);

Upvotes: 4

Views: 3623

Answers (1)

RuiFig
RuiFig

Reputation: 493

As you said, its run method returns immediately because it has no work. You need to use boost::asio::io_service::work . Think of it as a dummy work item, so io_service::run never runs out of work, and thus doesn't return immediately.

Example:

    auto work = boost::make_shared<boost::asio::io_service::work>(m_ioservice);
    m_ioservice.run();

Some people prefer an io_service::run to always block, waiting for work. Other people prefer the behavior Asio gives you by default.

Upvotes: 11

Related Questions