Boost:asio单io_service,多线程run

385 篇文章 ¥159.90 ¥299.90
博客介绍了在Boost.asio中,如何使用单个io_service并用多个线程执行run方法来实现异步IO处理。通过示例展示了两个线程如何根据调度协同工作,动态分配和执行注册在io_service上的定时器任务,展示了一种线程间任务调度的机制。

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

io_service相当于注册异步回调的一个上下文环境,而run相当于处理异步io的上下文(通常是一个线程)。

单io_service,多线程run,相当于多个线程同时来处理注册在一个io_service上的回调:

//sio_mth.cpp
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time_types.hpp>
#include <iostream>
#include <chrono>
#include <thread>
#include <functional>
using namespace boost::asio;
using namespace std;
 
thread_local int t_id = 0;
unsigned long getTimestamp()
{
    return std::chrono::system_clock::now().time_since_epoch().count()/std::chrono::system_clock::period::den;
}
 
void timer_handler(int timerID, const boost::system::error_code& err)
{
    if (err)
    {
        cout << getTimestamp() << " Timer cancel&
### Boost.Asio TCP Server 实现读写操作 通过 `Boost.Asio` 可以高效地管理线程并处理网络通信中的读写操作。下面是一个基于 C++ 的示例程序,展示如何使用 `std::shared_ptr` 和集合来管理多线程环境下的 TCP 服务器。 #### 主要组件说明 - 使用 `boost::asio::ip::tcp::acceptor` 来监听传入连接。 - 利用 `std::shared_ptr` 管理会话对象的生命周期。 - 将线程存储在一个容器中以便统一管理和释放资源[^1]。 以下是完整的代码实现: ```cpp #include <iostream> #include <set> #include <memory> #include <boost/asio.hpp> #include <boost/thread.hpp> using boost::asio::ip::tcp; class Session : public std::enable_shared_from_this<Session> { public: Session(tcp::socket socket) : socket_(std::move(socket)) {} void start() { do_read(); } private: tcp::socket socket_; char data_[1024]; void do_read() { auto self(shared_from_this()); socket_.async_read_some(boost::asio::buffer(data_, sizeof(data_)), [this, self](const boost::system::error_code& ec, std::size_t length) { if (!ec) { do_write(length); } }); } void do_write(std::size_t length) { auto self(shared_from_this()); boost::asio::async_write(socket_, boost::asio::buffer(data_, length), [this, self](const boost::system::error_code& ec, std::size_t /*length*/) { if (!ec) { do_read(); // 继续下一次读取 } }); } }; class Server { public: Server(boost::asio::io_context& io_context, short port) : acceptor_(io_context, tcp::endpoint(tcp::v4(), port)), threads_() { do_accept(); } ~Server() { for (auto& t : threads_) { if (t->joinable()) { t->join(); } } } private: tcp::acceptor acceptor_; std::set<std::shared_ptr<boost::thread>> threads_; void do_accept() { acceptor_.async_accept([this](const boost::system::error_code& error, tcp::socket socket) { if (!error) { handle_client(std::make_shared<Session>(std::move(socket))); } do_accept(); }); } void handle_client(const std::shared_ptr<Session>& session) { auto new_thread = std::make_shared<boost::thread>( [&]() { session->start(); } ); threads_.insert(new_thread); // 插入到集合中进行管理 } }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: async_tcp_server <port>\n"; return 1; } boost::asio::io_context io_context; Server s(io_context, std::atoi(argv[1])); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } ``` 此代码展示了如何创建一个多线程 TCP 服务器,并利用 `std::shared_ptr` 自动管理每个客户端会话的内存分配和销毁过程。 #### 关键点解释 - **异步 I/O 操作**:通过调用 `async_read_some` 和 `async_write` 方法实现了非阻塞式的数据传输。 - **线程池管理**:每当有新客户接入时都会启动一个新的工作线程去负责该客户的全部交互逻辑;这些线程被保存至一个标准库提供的关联容器 (`std::set`) 中,在析构函数里逐一回收它们所占用的操作系统级资源。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风静如云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值