【问题标题】:One asynchronous thread per task?每个任务一个异步线程?
【发布时间】:2016-01-16 02:42:21
【问题描述】:

我的应用程序当前有一个“任务”列表(每个任务都由一个函数组成 - 该函数可以像打印一些东西一样简单,但也可以更复杂),它会循环通过。 (附加说明:大多数任务在执行后会发送一个数据包)由于其中一些任务可能需要相当长的时间,我考虑为每个任务使用不同的异步线程,从而让所有任务同时运行。
这样做是否明智?
一个问题是我不可能事先知道任务的数量,因此可能会导致创建相当多的线程,我在某处读到每种不同的硬件都有其局限性。我计划在树莓派上运行我的应用程序,我认为我总是需要运行 5 到 20 个任务。

此外,一些任务的运行“优先级”低于其他任务。

我应该先运行重要的任务,然后再运行不太重要的任务吗? (这里的问题是,如果所有任务所需的时间总和超过了一些特定的重要任务应该运行的时间,我的应用程序将不再准确)或者在异步线程中实现所有内容?或者只是尝试通过仅在异步线程中使用“数据包发送”来使一切变得更快,从而不必等到数据包实际发送?

【问题讨论】:

  • 你看过 OpenMP (openmp.org)
  • @WilliamJones 谢谢,我会读一读。但我认为现在我的问题仍然太理论化,无法选择图书馆:首先我需要知道我想做的事情是否可行,或者是否有更好的方法。

标签: c++ multithreading networking asynchronous task


【解决方案1】:

在合理设计解决方案之前,您需要问自己很多问题。

  1. 您希望限制并发任务的数量吗?

  2. 未来并发任务的数量是否可能会以您今天无法预测的方式增加?

...可能还有更多。

如果其中任何一个的答案是“是”,那么您有几个选择:

  • 具有固定数量的线程排空队列的生产者/消费者队列(恕我直言,不推荐)

  • 将您的任务编写为异步状态机,围绕事件分派器,例如 boost::io_service(这更具可扩展性)。

如果你知道它只会有 20 个并发任务,你可能会选择std::async,但这是一种草率的代码编写方式。

【讨论】:

  • (1) 我个人不想限制它们。我猜是硬件限制了它们。 (2)并发任务的数量并不能真正增加多少,因为任务的数量也受到硬件的限制。为什么它会是一种草率的方式来编写代码?感谢您的回答。
  • c++ 标准中未定义允许的并发线程数。也没有(便携式)方法可以查询系统的线程限制。这支持一种方法,程序可用的线程数由环境(confit 文件、命令行等)提供。然后,这证明了一种基于异步任务的方法,因为我们不受任意线程限制的约束。
  • 好吧,如果您忘记编程方面本身,我认为您可以同时运行多少线程很大程度上取决于硬件?而且由于我计划在一台非常小的 PC 上运行我的应用程序,比如 RaspberryPi,我真的不确定 20 个并发线程是否太多。
  • 最终答案(如果有的话)将在您的标准库实现和/或操作系统文档的文档中。在我对 linux 和 OS X 的测试中,我在启动大约 200 个线程后开始遇到问题。
猜你喜欢
  • 2011-12-08
  • 2017-10-06
  • 2017-10-05
  • 2020-10-15
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多