我正在尝试在folly::ThreadedExecutor中添加一些愚蠢的:: Function正常工作。但是,folly::ThreadedExecutor似乎仅提供接受 folly::Function<void()>
的接口(interface)。如何添加带有参数和输出的函数?
// Here's a simple code segment
#include <folly/executors/ThreadedExecutor.h>
#include <folly/futures/Future.h>
int my_func(int t) {
sleep(t);
return 1;
}
int main() {
folly:ThreadedExecutor executor;
folly:Function<int(int)> job = my_func;
executor.add(job);
}
用
gcc -o folly_executor --std=c++14 -g -O0 -Wall folly_executor.cc -lgtest -lfolly -lpthread -lglog -lgflags -ldl -ldouble-conversion -levent -liberty -lboost_context
编译该错误表明
add
和executor
中的my_func
函数原型(prototype)不匹配。以下是编译错误。In file included from folly_executor.cc:2:0:
/usr/local/include/folly/executors/ThreadedExecutor.h:67:8: note:
candidate: virtual void folly::ThreadedExecutor::add(folly::Func)
void add(Func func) override;
^~~
/usr/local/include/folly/executors/ThreadedExecutor.h:67:8: note: no
known conversion for argument 1 from 'folly::Function<int(int)>' to
'folly::Func {aka folly::Function<void()>}'
我想知道添加函数原型(prototype)的限制是否有必要的原因。如果没有,那一定是正确的方法。
顺便说一句,Github上的tutorial和文档始终将folly::executor与folly:Future一起使用。我应该以这种方式使用folly:Function吗?
最佳答案
感谢Alex Bakulin的answer。我使用folly::Future
接口(interface)解决了我的问题,以下是我的示例代码。就我而言,我将Future
与AtomicHashMap
一起使用。使用Future
可以通过folly::via
和std::bind
轻松地输入和访问输出。但是我仍然对为什么他们缩小Folly::Function
的使用范围感到困惑,并期望它仅用于存储可调用对象而没有任何输入和输出。
#include <folly/executors/CPUThreadPoolExecutor.h>
#include <folly/futures/Future.h>
#include <folly/AtomicHashMap.h>
folly::Future<int> my_func(int t, folly::AtomicHashMap<int, int>& ahm) {
ahm.insert(std::make_pair(t, t*2));
return 1;
}
int main() {
folly::CPUThreadPoolExecutor executor(8);
folly::AtomicHashMap<int, int> ahm(4096);
for (int i = 0; i < 3; i++) {
folly::Future<int> f = folly::via(&executor, std::bind(my_func, i, std::ref(ahm)));
}
executor.join();
for (int i = 0; i < 3; i++) {
auto ret = ahm.find((i));
int r = ret != ahm.end() ? ret->second : 0;
std::cout << i << "th result is "<< r << std::endl;
}
return 0;
}