C++ 对接受参数的函数使用boost::asio::post
我不熟悉使用boost和线程池。我想向线程池传递一个函数,该线程池将变量作为参数。在这个简单的例子中,我只是传入一个整数。我的理解是post将调用线程池中的一个可用线程来做一些事情。如果我将printProduct设置为不接受任何变量,代码就会编译,但这不是我最终要做的 参考相关文档将非常有帮助。我还没有成功地找到很多关于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>
#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});