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++如何运行多个可以随时调用的后台函数线程?的主要内容,如果未能解决你的问题,请参考以下文章