使用std::async从线程调用函数
Using std::async for function call from thread?
我正在运行两个并行线程。其中一个线程需要在条件语句实现时调用异步函数。我发现std::async
使用启动策略执行异步函数调用,但我有一些问题。
-
是否有策略使其等待条件语句发生?根据我从这篇文章中了解到的
wait_for
和wait_until
函数有很多种,但是我发现它们都包含一个时间函数,这些可以适当修改吗? -
会在async函数结束时自动调用析构函数吗?
-
函数调用是否会以任何方式影响父线程的功能?
当您调用std::async
时,您向它传递要调用的函数的地址(以及您想要传递给该函数的任何参数)。
然后创建一个线程来异步执行该函数。它返回一个future
,父线程可以使用它从子线程获取结果。典型的用法是这样的:
#include <string>
#include <future>
#include <iostream>
#include <chrono>
std::chrono::seconds sec(1);
int process() {
std::cerr << "Doing something slown";
std::this_thread::sleep_for(sec);
std::cerr << "donen";
return 1;
}
int main(int argc, char **argv) {
if (argc > 1) {
auto func = std::async(process);
std::cerr << "doing something else that takes a whilen";
std::this_thread::sleep_for(sec);
func.get();
}
}
注意,我们只需要在返回的future上使用.get
来同步线程。sleep_for
只是模拟每个线程做一些至少需要一段时间的事情——如果它们完成得太快,它们就没有机会真正并行执行,因为第一个运行的线程可能在第二个线程有机会开始运行之前完成并退出。
如果你想创建显式线程(即,创建std::thread
的实例),那就是你最终使用std::wait_for
之类的(或者可以最终使用它们,无论如何)。使用期货(即你用std::async
创建的),你只需要使用.get
等待线程完成并检索线程函数返回的任何内容。
相关文章:
- 如何用参数值调用函数(仅在运行时已知)
- 从python中调用C++函数并获取返回值
- 当使用通配符和null指针调用函数时,对输出的说明
- 从R调用C++函数并对其进行集成时出错
- 使用QTreeView,如何通过调用函数只突出显示特定的行/列
- 如何在qt中从另一个类调用函数
- 在 COUT 语句中使用 COUT 调用函数
- 如何从线程中的不同模块调用函数?
- C++从函数指针数组调用函数
- 当 A 在 for 循环中调用函数 B 时,如何计算函数 A 的空间复杂度?
- 如何在 C/C++ 中从外部库调用函数
- 如何使用运算符在同一行中多次调用函数
- 是否可以创建一个从不同类调用函数的线程?
- 无法为类成员调用函数
- 如何从另一个标头 c++ 调用函数
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 如何只允许在调用函数 B 后调用函数 A?
- 我可以这样调用函数吗?
- 如何在 c++ 的类中递归调用函数方法?
- 为什么在指向对象的迭代器上调用函数不允许我更改对象本身?