【问题标题】:Using boost::asio::post for a function that takes in parameters将 boost::asio::post 用于接受参数的函数
【发布时间】:2020-06-18 11:32:40
【问题描述】:

我不熟悉使用 boost 和线程池。我想将一个函数传递给一个以变量为参数的线程池。在这个简单的例子中,我只是传入一个整数。我的理解是 post 将调用线程池中的可用线程来做某事。如果我将 printProduct 设置为不接受任何变量,代码就会编译,但这不是我最终想要做的。

参考相关文档会很有帮助(我还没有成功找到关于 boost::asio::post 的太多讨论),以及有关如何解决问题的建议。谢谢!

#include <cstdlib> 
#include <iostream>
#include <pthread.h>
#include <boost/version.hpp>    // version is 1.72
#include <boost/asio.hpp>
#include <boost/asio/io_service.hpp>
#include <boost/bind.hpp>
#include <boost/thread/thread.hpp>
#include <boost/thread/thread_pool.hpp>
#include <boost/asio/thread_pool.hpp>
#include <boost/asio/post.hpp>
#include <boost/lockfree/queue.hpp>

using namespace std;

int printProduct(int endval){
    // int endval = 1000000;
    int prod = 1;
    for (int i=0;i<endval;i++){
        prod = prod * i;
    }
    return prod;
}


int main() {

    boost::asio::thread_pool tp(8);

    for (int i =0; i<200; i++){
        // issue is how to pass the parameter into post
        boost::asio::post(tp, printProduct,i);
        // boost::asio::post(tp, printProduct(i));
    }
}

【问题讨论】:

    标签: c++ multithreading boost threadpool boost-asio


    【解决方案1】:

    boost::asio::post 接受任何可调用对象。此类对象的要求您可以找到here

    有很多方法可以实现你想要的:

    [1] lambda 表达式

    boost::asio::post(tp, [i]{ printProduct(i); });
    

    [2] 绑定

    boost::asio::post(tp, std::bind(printProduct,i));
    

    [3] 自定义函子类

    struct Wrapper {
        int i;
    
        Wrapper(int i) : i(i) {}
    
        void operator()() {
            printProduct(i);
        }
    };
    
    boost::asio::post(Wrapper{i});
    

    【讨论】:

      猜你喜欢
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 2017-05-04
      • 2017-02-20
      • 2014-07-11
      相关资源
      最近更新 更多