面试题答案
一键面试- io_context简介:
io_context
是Boost.Asio库中的核心对象,它负责管理和执行异步操作。它维护一个任务队列,异步操作完成后,相关的处理函数会被添加到这个队列中,io_context
的线程会从队列中取出任务并执行。 - 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
来执行异步任务。