C++ 如何将带有参数的folly函数添加到folly执行器中?

C++ 如何将带有参数的folly函数添加到folly执行器中?,c++,multithreading,folly,C++,Multithreading,Folly,我正在尝试添加一些普通作业,它们是folly::ThreadedExecutor中的folly::Function。然而,folly::ThreadedExecutor似乎只提供接受folly::Function的接口。如何添加带有参数和输出的函数 // Here's a simple code segment #include <folly/executors/ThreadedExecutor.h> #include <folly/futures/Future.h>

我正在尝试添加一些普通作业,它们是folly::ThreadedExecutor中的folly::Function。然而,folly::ThreadedExecutor似乎只提供接受folly::Function的接口。如何添加带有参数和输出的函数

// 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);  
}
我想知道添加函数原型的限制是否有必要的原因。如果不是,那一定是正确的方法


顺便说一下,Github上的和文档总是将folly::executor与folly:Future一起使用。我应该这样使用folly:Function吗?

您可能已经自己解决了所有问题,但为了完整起见,我会给出一个答案
ThreadedExecutor
是一个非常低级的东西,它只在单独的线程中为您运行东西。当您安排某个函数运行时,您无法控制它返回的时间和内容。如果您只需要在单独的线程中进行函数调用,则可以将此调用封装在匿名函数中,并使用执行者期望的签名:

executor.add([]() { my_func(123); });
如果您的目标也是捕获调用的输出,那么使用它会更好,因为它具有更高的抽象级别,并为您提供了更丰富的原语集。

感谢Alex Bakulin的帮助。我用
folly::Future
接口解决了我的问题,下面是我的示例代码。在我的例子中,我将
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;
}
#包括
#包括
#包括
folly::Future my_func(int t,folly::AtomicHashMap&ahm){
ahm.插入物(标准::组成配对(t,t*2));
返回1;
}
int main(){
愚蠢::cputhreadpool执行者执行者(8);
愚蠢:原子哈希曼(4096);
对于(int i=0;i<3;i++){
folly::Future f=folly::via(&executor,std::bind(my_func,i,std::ref(ahm));
}
executor.join();
对于(int i=0;i<3;i++){
自动检索=ahm.find((i));
int r=ret!=ahm.end()?ret->second:0;

std::cout创建时,请确保生成错误的是实际代码!您显示的当前代码将有错误,但不是您询问的错误。感谢您的评论。我已编辑了我的问题。如果需要,我将提供进一步的额外信息。
#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;
}