Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对接受参数的函数使用boost::asio::post_C++_Multithreading_Boost_Threadpool_Boost Asio - Fatal编程技术网

C++ 对接受参数的函数使用boost::asio::post

C++ 对接受参数的函数使用boost::asio::post,c++,multithreading,boost,threadpool,boost-asio,C++,Multithreading,Boost,Threadpool,Boost Asio,我不熟悉使用boost和线程池。我想向线程池传递一个函数,该线程池将变量作为参数。在这个简单的例子中,我只是传入一个整数。我的理解是post将调用线程池中的一个可用线程来做一些事情。如果我将printProduct设置为不接受任何变量,代码就会编译,但这不是我最终要做的 参考相关文档将非常有帮助。我还没有成功地找到很多关于boost::asio::post的讨论,以及关于如何解决问题的建议。谢谢 #include <cstdlib> #include <iostream>

我不熟悉使用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));
    }
}
接受任何可调用对象。您可以找到对此类对象的要求

有很多方法可以实现您的目标:

[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});