boos :: asio async_wait好像在阻塞

时间:2016-02-17 20:02:37

标签: c++ multithreading boost boost-asio

我正在学习提升asio文档。我遇到了这个deadline_timer示例。

#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>


/*This timer example shows a timer that fires once every second.*/

void print(const boost::system::error_code& e, boost::asio::deadline_timer* t, int* count)
{
    if (*count < 5)
    {   
        std::cout << *count << std::endl;
        ++(*count);

        t->expires_at(t->expires_at() + boost::posix_time::seconds(1));

        t->async_wait(boost::bind(print,boost::asio::placeholders::error, t, count));
    }   
}

int main()
{
    boost::asio::io_service io; 

    int count = 0;

    boost::asio::deadline_timer t(io, boost::posix_time::seconds(10));

    auto myfunc = boost::bind(print, boost::asio::placeholders::error, &t ,&count);
    t.async_wait(myfunc);

    std::cout << "async wait " << std::endl;

    io.run();

    std::cout << "Just called io.run() " << std::endl;                                                                                                                                                             

    std::cout << "Final count is " << count << std::endl;

    return 0;
}

async_wait()函数似乎阻塞(即等待10秒计时器到期)

以上程序的输出如下:

async wait 
0
1
2
3
4
Just called io.run() 
Final count is 5

我希望async_wait()创建一个单独的线程并等待计时器在那里同时执行主线程。

即我希望程序打印

Just called io.run() 
Final count is 5

等待计时器到期。我的理解错了吗?

这是我对async_wait()的理解。此实现看起来更像blocking wait。我的理解错了吗?我错过了什么?

2 个答案:

答案 0 :(得分:3)

io.run();语句是解释您获得的输出与您期望的输出之间差异的关键。

在ASIO框架中,任何异步命令都需要有一个专用线程来运行回调。但由于ASIO相对较低,它希望您自己提供该线程。

因此,当您在主线程中调用io.run();时,您正在执行的操作是向框架指定您打算在主线程上运行所有异步命令。这是可以接受的,但这也意味着该程序将阻止io.run();

如果您打算在单独的线程上运行命令,那么您必须编写如下内容:

std::thread run_thread([&]() {
    io.run();
});

std::cout << "Just called io.run() " << std::endl;                                                                                                                                                             

std::cout << "Final count is " << count << std::endl;

run_thread.join();

return 0;

答案 1 :(得分:1)

async_wait功能未阻止,run是。这是run的工作。如果您不希望线程在io_service的处理循环中阻塞,请不要调用该线程run

async_wait函数不会创建任何线程。这会使它变得昂贵并且使控制服务于io_service的线程数量变得更加困难。

您的期望是不合理的,因为从main返回会终止该过程。那么谁或等什么等待计时器?