boost bind及多线程

本文介绍了如何利用Boost库中的bind功能创建仿函数,并结合多线程进行参数灵活传递,简化了C语言风格的多线程编程。通过示例代码展示了其在实际项目中的高效应用。

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

之前项目中用到学习了一下,今天总结总结

bind生成一个仿函数,可以配接任意函数(裸函数,类成员函数,静态成员函数)指定参数传递方式个数。在需要仿函数的地方(accumulate,for_each等)超级好用

#include <iostream>
#include <algorithm>
#include <numeric>
#include <map>
#include <vector>

#include <boost/bind.hpp>

using namespace std;

struct comp {
    pair<double, double> operator()(const pair<double, double>& init, double x) const {
        return make_pair(init.first + x, init.second + x*x);
    }
};

class A {
public:
    pair<double, double> sum(const pair<double, double>& init, double x) const {
        return make_pair(init.first + x, init.second + x*x);
    }
};

pair<double, double> sum(const pair<double, double>& init, double x, double y, double z) {
    return make_pair(init.first + x + y, init.second + x*x);
}

pair<double, double> sum2(const pair<double, double>& init, double x, double y) {
    return make
### 使用 `boost::asio` 实现多线程高并发处理 为了实现多线程环境下高效的异步 I/O 操作,`boost::asio` 提供了一系列工具来简化这一过程。核心组件包括 `io_context`、`strand` 和工作守护对象。 #### io_context 的作用 `io_context` 是所有异步操作的核心调度器,在多线程环境中,可以通过创建多个线程并让它们都运行同一个 `io_context` 来分担任务负载[^1]。 ```cpp #include <iostream> #include <boost/asio.hpp> int main() { boost::asio::io_context ioc; // 启动多个线程执行 io_context.run() std::vector<std::thread> threads; const int thread_count = 4; // 假设有四个 CPU 核心可用 for (int i = 0; i < thread_count; ++i) { threads.emplace_back([&ioc]() { ioc.run(); }); } // 让主线程等待其他线程完成 for (auto& t : threads) { if (t.joinable()) t.join(); } } ``` #### Strand 的重要性 当存在多个异步调用可能竞争同一资源时,使用 `boost::asio::strand` 可以确保这些调用按顺序串行化执行,防止竞态条件的发生。 ```cpp boost::asio::io_context ioc; boost::asio::ip::tcp::socket socket(ioc); boost::asio::strand<boost::asio::io_context::executor_type> strand{ioc.get_executor()}; // 将异步操作提交给特定的 strand 执行 socket.async_read_some(boost::asio::buffer(data), strand.wrap(std::bind(...))); ``` #### 工作守护对象 Work Guard 为了避免 `io_context::run()` 方法因无待处理事件而提前返回,通常会引入一个名为 work guard 的机制来保持至少有一个活动的工作项直到程序真正结束前。 ```cpp boost::asio::io_context ioc; auto work_guard = make_work_guard(ioc); std::vector<std::thread> threads; for (unsigned i = 0; i < num_threads; ++i){ threads.emplace_back( [&ioc]{ ioc.run(); }); // 运行 io_context } // 当不再需要继续运行时销毁 work_guard 对象 work_guard.reset(); // 加入所有子线程 for(auto &t : threads) t.join(); ``` 通过上述方式组合运用 `io_context`, `strand` 和工作守护者模式,可以在 C++ 中构建高效稳定的多线程网络应用程序框架。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值