boost::asio小记

同步通讯的流程同步通讯的过程

io对象

I/O对象(通常需要使用io_service构造)
例如一个TCP套接字

boost::asio::ip::tcp::socket socket(io_service);
socket.connect(endpoint, error_code);
socket.read_some(asio::buffer,error_code);
boost::asio::io_service

程序中需要至少定义一个io_service对象
io_service表示程序到操作系统I/O服务的“连接”。
io_service对象是asio框架中的调度器,所有异步io事件都是通过它来分发处理的(io对象的构造函数中都需要传入一个io_service对象)。io_servie 实现了一个任务队列,io_servie最常用的两个接口是post和run,post向任务队列中投递任务,run是执行队列中的任务,直到全部执行完毕,并且run可以被N个线程调用。Io_service是完全线程安全的队列。

asio::io_service io_service;
asio::ip::tcp::socket socket(io_service);

io_service提供的是一个生产者消费者模型。在异步io操作中需要我们手动控制消费者,调用run函数

boost::asio::io_service::work

防止io_service.run()结束后线程退出
boost::asio::io_service io;
boost::asio::io_service::work work(io);
io.run();

work是一个很小的辅助类,只支持构造函数和析构函数。 构造一个work时,outstanding_work_+1,使得io.run在完成所有异步消息后判断outstanding_work_时不会为0,因此会继续调用GetQueuedCompletionStatus并阻塞在这个函数上。
而析构函数中将其-1,并判断其是否为0,如果是,则post退出消息给GetQueuedCompletionStatus让其退出。特别注意的是,work提供了一个拷贝构造函数,因此可以直接在任意地方使用。对于一个io_service来说,有多少个work实例关 联,则outstanding_work_就+1了多少次,只有关联到同一个io_service的work全被析构之后,io.run才会在所有消息处 理结束之后正常退出。

多个线程运行一个io_service对象的run方法

异步io事件都是通过io_service来分发处理

void Server::start(int threadNum)//创建线程池
{
    if (!m_stop || threadNum <= 0)
        return;

    m_stop = false;
    m_work.reset(new boost::asio::io_service::work(m_ios));
    m_threads.clear();

    for (int i = 0; i < threadNum; ++i) {//创建线程
        auto thread = std::make_shared<std::thread>(std::bind(&Server::run, this));//通过函数对象创建线程,线程调用io_service::run方法
        //std::thread t = std::bind(&Server::run, this);
        m_threads.push_back(thread);
    }
}


void Server::run()
{
    
    while (!m_stop) {
        try {
            m_ios.run();
        }
        catch(std::exception& e) {
            LOG_ERROR("exception: %s", e.what());
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值