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

Posted

技术标签:

【中文标题】C++如何运行多个可以随时调用的后台函数线程?【英文标题】:C++ how ro run multiple backgound function thread that can be called anytime? 【发布时间】:2019-01-14 02:58:01 【问题描述】:

在 C++ 中,有没有办法在代码开始时创建 - 比如说 - 5 个线程,然后让它们在我的代码的主要部分运行的整个过程中在后台等待?这 5 个线程在代码主进程的不同时间点等待被调用。

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

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

【问题讨论】:

std::async 不保证代码在后台线程中运行 - 或者它完全同时运行。规范只要求它异步运行,这与并发不同。该规范允许 std::async 的用户函数仅在 promise 被解析时被调用。 我想你要找的是std::condition_variable。它上面的 cppreference 页面提供了一个很好的使用示例。 线程不会“被调用”。 std::thread 是一个自包含的执行线程。调用和执行一些代码的是执行线程本身。您的问题不清楚。 听起来你想要一个“线程池”。是的,它可以做到。但解释这一切有点宽泛。你可能会写一篇关于这个主题的论文。 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于C++如何运行多个可以随时调用的后台函数线程?的主要内容,如果未能解决你的问题,请参考以下文章

iOS:在多个后台线程完成之前不要从函数返回

iOS保持线程在后台运行

C++线程更新变量问题

C++ 中的运行时内存分析

C语言如何终止线程?

c++线程函数中如何调用该方法下的外部函数?