将 boost::asio::post 用于接受参数的函数

Isa*_*ine 0 c++ multithreading boost boost-asio threadpool

我是使用 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));
    }
}
Run Code Online (Sandbox Code Playgroud)

raf*_*x07 8

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

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

[1] lambda 表达式

boost::asio::post(tp, [i]{ printProduct(i); });
Run Code Online (Sandbox Code Playgroud)

[2] 绑定

boost::asio::post(tp, std::bind(printProduct,i));
Run Code Online (Sandbox Code Playgroud)

[3] 自定义函子类

struct Wrapper {
    int i;

    Wrapper(int i) : i(i) {}

    void operator()() {
        printProduct(i);
    }
};

boost::asio::post(Wrapper{i});
Run Code Online (Sandbox Code Playgroud)