0

我正在处理一段多线程代码,但我似乎无法将 std::function 对象传递给 std::async 函数。我确定我做错了什么,但我不知道那会是什么。因此,我准备了这段代码,所以也许知道的人可以帮助我。

Test1 证明这个 std::function 对象有效。
Test2 包含我想要它做的事情;只有我将函数对象包装成一个 lambda。
Test3 包含我无法弄清楚的示例。

std::function<void(AsyncFunctionExample&)> current_function;

void Test1() {
  current_function = &AsyncFunctionExample::Function1;
  while(current_function != nullptr)
    current_function(*this);
}

void Test2() {
  current_function = &AsyncFunctionExample::Function1;
  while(current_function != nullptr)
    const std::future<void> function_future = std::async([&](){current_function(*this);});
}

void Test3() {
  current_function = &AsyncFunctionExample::Function1;
  while(current_function != nullptr)
    const std::future<void> function_future = std::async(current_function, *this);
}

可以在此处找到此示例的完整代码。Stackoverflow 编辑器警告说,我不允许转储完整的代码文件,这就是为什么我在这里把它归结为它的本质。

我收到的编译器错误是:
no matching function for call to 'async(std::function&, AsyncFunctionExample&)' const std::future function_future = std::async(current_function, *this);

这对我没有多大帮助。它基本上向我解释了没有与我的电话匹配的签名。但是我无法从这个错误中找出我的调用的哪一部分是错误的,我不明白如何更改它以便它可以工作。

4

1 回答 1

3

您不能通过引用,std::async因为它需要复制值。您可以使用以下方法解决此问题std::ref

const std::future<void> function_future = std::async(current_function, std::ref(*this));

或者,只需将您的功能更改为:

std::function<void(AsyncFunctionExample*)> current_function;

然后就可以this直接通过了:

const std::future<void> function_future = std::async(current_function, this);
于 2019-08-15T13:35:05.293 回答