当前位置: 首页 > 知识库问答 >
问题:

c++,如何在每个工作线程必须执行少量不同任务的情况下为任务实现线程池

谢阳成
2023-03-14

我正在分析一个视频流。对于每个新的图像(帧),我依次执行以下3个任务:

  1. 减小图像大小
  2. 检测面
  3. 跟踪图像中最重要的4个面
    null

理想的解决方案:我只想创建一次4个worker线程(每个worker能够执行所有3个不同的任务)。这些工人将存在于整个视频处理过程中。在每一个视频帧上,主要的过程会把图像大小的调整任务抛给工作人员,然后是检测,然后是跟踪。

一个丑陋的实现将是每个工作线程都是一个很大的函数,实现了所有3个任务。Main process只是告诉每个worker要执行哪个任务(worker有一个'switch'语句来选择请求的任务)。这是一个丑陋的解决方案,因为在未来,当我将有30个不同的任务在管道而不是3-工人的代码将变得巨大。此外,这个解决方案违反了封装规则,因为它要求所有任务都驻留在同一个函数中+对于每个新任务,我需要更改worker的代码

一个干净的实现是,主进程为每个工作者提供一个指向函数(要执行的任务)的指针和一些参数。因此,我可以很容易地在视频处理管道中添加新任务,而不需要更改worker的代码,因为worker的代码是通用的(执行指向函数的指针,并等待带有新指针的请求到达),但这里的问题是每个任务都有不同数量的参数(不同的函数接口),并且worker不知道如何调用/执行给定函数的地址。

在我的例子中,使用线程池的好方法是什么,同时尽可能保持代码泛型,并且能够将它从3个任务扩展到30个任务。

附注。-我的代码可以在任何平台上运行(Android、iOS、linux、windows server、windows phone等)。所以我更喜欢通用的解决方案,而不是特定于操作系统或编译器的解决方案

共有1个答案

帅令雪
2023-03-14

您的错误在于您过于专注于使用函数。

一种老式的方法是让一个基类task带有一个成员函数virtual void operator()();。然后,对于应该是任务的任何内容,您可以创建task的子类,该子类包含运行所需的所有相关数据,并提供operator()的适当重写。

一种更现代的方法是使任务成为std::function 的实例,这不仅适用于上述方法,而且适用于实际上具有该签名和lambdas的函数的情况。(或者由于您正在执行多线程操作,可能需要类似std::packaged_task 的内容;我还没有真正研究这些内容是如何使用的)

无论哪种方式,一旦工作线程获得对任务的引用,它们只需调用task();来执行任务。

 类似资料:
  • 我有一个类,它基本上会做两次相同的步骤。听起来像是一个在哪里多线程处理程序的完美例子。我的问题是,如果我只需要两个线程就可以做到这一点。以下是一般情况 我已经完成了第一部分——构建对象——的工作。我现在的问题是- 如何让主线程等待两个线程完成其第一部分?也许main会在两个对象上执行等待,然后在线程notifyAll之后,它们会在主线程上执行等待?但是线程如何抓住主线程呢?也许用这个 我怎样才能在

  • 在我的项目中,我正在构建一个Java的执行框架,它接收来自客户端的工作请求。工作(大小不同)被分解为一组任务,然后排队等待处理。有单独的队列来处理每种类型的任务,每个队列都与一个ThreadPool相关联。ThreadPools的配置方式使引擎的整体性能达到最佳。 这种设计有助于我们有效地平衡请求的负载,大型请求不会占用系统资源。然而,当一些队列为空并且它们各自的线程池闲置时,该解决方案有时会变得

  • 主要内容:1 如何使用多个线程执行一个任务,2 如何使用多个线程执行多个任务1 如何使用多个线程执行一个任务 如果需要由多个线程执行单个任务,则只有一个run()方法,例如: 1.1 多个线程执行一个任务示例1 输出结果为: 1.2 多个线程执行一个任务示例2 输出结果为: 注意:每个线程在单独的堆栈中运行。 2 如何使用多个线程执行多个任务 如果必须通过多个线程执行多个任务,请使用多个run() 方法: 2.1 多个线程执行多个任务示例1 输出结果为: 2.2 多个线程

  • 问题内容: 我是python和线程的新手。我已经编写了充当网络爬虫的python代码,并在网站中搜索特定的关键字。我的问题是,如何使用线程同时运行类的三个不同实例。当实例之一找到关键字时,所有三个实例都必须关闭并停止爬网。这是一些代码。 如何使用线程让Crawler同时执行三个不同的爬网? 问题答案: 似乎没有一种(简单的)方法可以终止Python中的线程。 这是一个并行运行多个HTTP请求的简单

  • 问题内容: 假设我们正在集群模式下工作,我们有三个节点: 经理1 工人1 工人2 是否可以创建服务并指定任务仅在工作者(worker1和worker2)中运行,而不必在管理者(manager1)中运行 我正在运行以下命令来创建服务: 当我ps服务时: 我得到: 问题答案: 虽然您可以使用 约束 (带有)根据节点的角色(管理者或工作人员)消除节点的子集,但我将通过以下方式 使Manager不再像Wo