C++如何运行可以随时调用的多个后台函数线程?

标签 c++ multithreading parallel-processing std

在 C++ 中,有没有一种方法可以在代码的开头创建(比如说)5 个线程,然后让它们在我的代码主要部分运行的整个过程中一直在后台等待?这 5 个线程在代码的主进程中的不同时间点等待调用。

我喜欢这 5 个线程“包含”一个函数,这样在我代码的主要部分的某个时刻(在预处理 5 个输入之后)我可以同时调用这 5 个线程来异步计算 5 个输入的 5 个返回值平行。

我想我可以使用 std::async 来做到这一点,但我想避免与 std::async 可能会多次创建新的 5 个线程相关的大量成本,所以我只想在开始代码并在后台处于待机模式,直到我调用他们。

最佳答案

您的话中有一个常见的误解:“调用一个线程”。您不能“调用”线程。它不是一个函数。这只是一个作业调度概念。您可以创建线程并在线程环境中执行任务。

启动一个线程,需要提供一个函数指针和一组要在线程内执行的参数。线程创建非常高效,非常适合许多线程实现。这是处理线程的最简单方法。所以,我建议你使用它。

您想要的是创建一个固定大小的线程池。在这种情况下,每个线程都需要运行一个循环等待数据准备好的作业。一种常见的方法是使用条件变量检查事件,c++11 中的 std::condition_variable。当输入准备就绪时,主线程向变量发出信号,线程可以读取数据。当一个线程向变量发出信号时,无法知道哪个线程被唤醒。所以你必须确保输入在线程之间正确分配。因此,这是一种更复杂的方法,主要用于控制资源,并且可以在具有大量短任务的系统中提供一些性能增益。

无论如何,请谨慎使用结果。您可能需要使用互斥锁或其他方法来同步它们。

关于C++如何运行可以随时调用的多个后台函数线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54175267/

相关文章:

multithreading - Haskell:为什么 `par` 是这样定义的?

c++ - 如何跟踪消息响应时间和重传

c++ - 由于模板函数,我如何避免#includ-ing <sstream>?

c# - 如何将一个 for 循环分成多个循环并使用线程运行它们以缩短运行时间?

c++ - 为什么我无法编译这个简单的线程测试?

c - 如何等待其他线程初始化并在之后正确清理?

c# - Parallel.For 和 For 产生不同的结果

c - OMP C 中的嵌套 for 循环

c++ - 如何通过 std::vector<T> 的子类的重载赋值运算符进行深度复制?

c++ - 如何通过虚拟寻址区中的指针获取物理寻址区中的地址?