MST

星途 面试题库

面试题:网络编程之Boost.Asio中等难度题

在Boost.Asio中,如何使用io_context和strand来管理异步任务,以确保线程安全?请举例说明。
20.5万 热度难度
后端开发网络编程

知识考点

AI 面试

面试题答案

一键面试
  1. io_context简介io_context 是Boost.Asio库中的核心对象,它负责管理和执行异步操作。它维护一个任务队列,异步操作完成后,相关的处理函数会被添加到这个队列中,io_context 的线程会从队列中取出任务并执行。
  2. strand简介strand 用于确保提交到它的任务会被串行执行,避免多个线程同时访问共享资源导致的数据竞争问题,从而保证线程安全。

以下是一个简单示例:

#include <iostream>
#include <boost/asio.hpp>

void async_task(boost::asio::yield_context yield, int task_id) {
    try {
        // 模拟一些异步操作,这里使用sleep_for模拟
        boost::asio::steady_timer timer(boost::asio::get_associated_executor(yield), std::chrono::seconds(1));
        timer.async_wait(yield);
        std::cout << "Task " << task_id << " completed." << std::endl;
    } catch (std::exception& e) {
        std::cerr << "Exception in task " << task_id << ": " << e.what() << std::endl;
    }
}

int main() {
    boost::asio::io_context io;
    boost::asio::io_context::strand strand(io);

    // 创建并提交异步任务
    for (int i = 0; i < 5; ++i) {
        boost::asio::post(strand, [&io, i]() {
            boost::asio::co_spawn(io, [i](boost::asio::yield_context yield) {
                async_task(yield, i);
            }, boost::asio::detached);
        });
    }

    // 启动io_context
    std::vector<std::thread> threads;
    for (std::size_t i = 0; i < std::thread::hardware_concurrency(); ++i) {
        threads.emplace_back([&io]() { io.run(); });
    }

    // 等待所有线程完成
    for (auto& thread : threads) {
        thread.join();
    }

    return 0;
}

在上述代码中:

  • io_context io; 创建了一个 io_context 对象。
  • boost::asio::io_context::strand strand(io); 创建了一个与 io_context 关联的 strand 对象。
  • 通过 boost::asio::post(strand, [&io, i]() {... }); 将任务提交到 strand 中,这样任务会被串行执行。
  • boost::asio::co_spawn 用于创建并执行异步协程任务,async_task 函数模拟了一个异步操作。
  • 最后通过多个线程运行 io_context 来执行异步任务。