boost asio的异步事件处理函数是在执行异步事件的run函数所在的线程里面执行的

本文深入探讨Boost ASIO库中的异步事件处理机制,指出异步事件的回调函数实际上在调用`run()`方法的同一线程内执行。这有助于理解Boost ASIO的异步编程模型及其线程上下文。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <boost/asio/io_service.hpp>
#include <boost/asio/steady_timer.hpp>
#include <chrono>
#include <thread>
#include <iostream>
using namespace boost::asio;
int main()
{
    io_service ioservice;
    steady_timer timer1{ ioservice, std::chrono::seconds(1) };
    timer1.async_wait([](const boost::system::error_code & /* e */) {
        for (int i = 0; i < 5; ++i) {
            std::cout << "message from timer1." << std::this_thread::get_id() << std::endl;
        }
    });

    //steady_timer timer2{ ioservice, std::chrono::seconds(1) };
    //timer1.async_wait([](const boost::system::error_code & /* e */) {
    //  for (int i = 0; i < 5; ++i) {
    //      std::cout << "message from timer2." << std::this_thread::get_id() << std::endl;
    //  }
    //});
    std::thread thread1{ [&ioservice]() { ioservice.run(); } };
    std::thread thread2{ [&ioservice]() { ioservice.run(); } };
    thread1.join();
    thread2.join();
    return 0;
}

这里写图片描述

### Boost.Asio异步与同步操作的区别及用法 #### 一、基本概念 Boost.Asio 是一个跨平台 C++ 库,用于网络和低级 I/O 编程。它提供了两种主要的操作模式:**同步** 和 **异步**。 - **同步操作**是指程序执行过程中阻塞当前线程直到操作完成[^3]。 - **异步操作**则是指发起一个操作后立即返回控制权给调用者,在后台继续处理该操作,并通过回调函数或其他机制通知结果[^4]。 --- #### 二、同步操作的特点及用法 在同步模型下,Boost.Asio 的 API 调用会一直等待底层资源准备好或者操作完成后才返回。这种行为通常适用于简单的应用程序或不需要高并发性能的情况。 ##### 示例代码 (同步 TCP 客户端) ```cpp #include <boost/asio.hpp> #include <iostream> int main() { try { boost::asio::io_context io; boost::asio::ip::tcp::resolver resolver(io); auto endpoints = resolver.resolve("example.com", "http"); boost::asio::ip::tcp::socket socket(io); boost::asio::connect(socket, endpoints); // 阻塞直到连接成功 std::cout << "Connected to example.com!" << std::endl; // 发送数据(同样为阻塞) const char request[] = "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"; boost::asio::write(socket, boost::asio::buffer(request)); // 接收响应(也是阻塞) char reply[1024]; size_t bytes_transferred = boost::asio::read(socket, boost::asio::buffer(reply), boost::asio::transfer_at_least(1)); std::cout.write(reply, bytes_transferred); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } } ``` 此示例展示了如何使用 `boost::asio::connect` 进行同步连接以及读写操作。这些函数会在未满足条件前挂起线程[^5]。 --- #### 三、异步操作的特点及用法 相比之下,异步编程允许更高效地利用 CPU 时间片,因为它不会让主线程处于闲置状态。相反,它可以继续做其他事情,比如处理多个请求或管理更多资源。 ##### 主要组件 1. **Initiating Function**: 开始某个异步操作的函数,例如 `async_connect`, `async_read`, 或 `async_write`. 2. **Handler**: 当异步操作结束时被调用的一个可调用对象(通常是 lambda 表达式或绑定器)[^6]. ##### 示例代码 (异步 TCP 客户端) ```cpp #include <boost/asio.hpp> #include <memory> #include <functional> #include <iostream> void handleConnect(const boost::system::error_code& ec) { if (!ec) { std::cout << "Successfully connected asynchronously." << std::endl; } else { std::cerr << "Error during connection attempt: " << ec.message() << std::endl; } } int main() { boost::asio::io_context io; boost::asio::ip::tcp::resolver resolver(io); auto query = boost::asio::ip::tcp::resolver::query("example.com", "http"); auto it = resolver.async_resolve(query, [](const boost::system::error_code&, boost::asio::ip::tcp::resolver::iterator){}); boost::asio::ip::tcp::socket socket(io); boost::asio::async_connect(socket, it, &handleConnect); io.run(); // 让 IO 上下文驱动事件循环直至所有工作完成 } ``` 在这个例子中,我们看到的是非阻塞版本的连接尝试;一旦建立好链接,则触发预先定义好的 handler 函数[^7]。 --- #### 四、两者的主要区别总结表 | 特性 | 同步操作 | 异步操作 | |---------------------|-----------------------------------|----------------------------------| | 执行方式 | 堵塞当前线程 | 不堵塞任何线程 | | 性能 | 较差 | 更优 | | 复杂度 | 简单 | 较复杂 | | 并发能力 | 单次任务 | 支持多任务 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值