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

时间:2019-01-14 02:58:02

标签: c++ multithreading parallel-processing std

在C ++中,是否有一种方法可以在代码开始处创建5个线程,然后在我的代码主要部分运行的整个过程中让它们在后台等待?在代码的主要过程中,这5个线程正等待在不同的时间点被调用。

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

我想我可以使用std :: async来做到这一点,但我想避免与多次创建新的5个线程(std :: async可能这样做)相关的巨额成本,因此我只想在代码的开头,并在待机模式下处于后台,直到我可以调用它们为止。

1 个答案:

答案 0 :(得分:2)

用您的话来说,一个常见的误解是:“调用线程”。您不能“调用”线程。它不是功能。这只是一个工作计划的概念。您可以创建线程并在线程环境中执行任务。

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

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

无论如何,请小心如何使用结果。您可能需要使用互斥锁或其他方法对其进行同步。