在多线程库中转换future

Converting future in multithreaded library

本文关键字:转换 future 多线程      更新时间:2023-10-16

我正在使用一个简单的多线程库来尝试理解基础知识。

lib有一个队列函数,如下所示:

auto enqueue(F&& f, Args&&... args) 
-> std::future<typename std::result_of<F(Args...)>::type>;

并存储如下函数:

std::queue< std::function<void()> > tasks;

有一个关于如何传递lambda的例子,但我想传递成员变量。所以我创建了一个小对象:

Threadpool tp(4);
class myClass{
  vector<std::future<int>> res;
public:
  int compute(int i){
    return 2 * i;
  };
  void update(){
    for(int i = 0; i < 10; i++){
        res.emplace_back(
            // C2664 - 'std::future<int>::future(const std::future<int> &)': 
            // cannot convert argument 1 from 'std::future<_Rx>' to 'std::future<int> &&'
            tp.enqueue(std::bind(&myClass::compute, this), i)
        );
    };
  }
};

创建一个无参数的函数可以工作。但即使是网站上的lambda示例也可以使用传入的参数:

tp.enqueue([](int answer) { return answer; }, 42);

我在这里没有得到什么?

还有一个附带问题:当涉及到标准函数时,使用:

的优势是什么?
auto fn(...) -> return type 

代替:

return type fn(...)

占位符缺失:

tp.enqueue(std::bind(&myClass::compute, this, std::placeholders::_1), i);

tp.enqueue(std::bind(&myClass::compute, this, i));

或与

tp.enqueue([=]() { this->compute(i); });