【问题标题】:How to have a long waiting thread in Intel TBB?如何在英特尔 TBB 中有一个长等待线程?
【发布时间】:2014-02-07 03:22:23
【问题描述】:

我想创建一个线程或任务(准确地说不止一个),它会执行一些非 CPU 密集型工作,由于外部原因,例如 HTTP 请求或文件 IO 操作,这些工作将花费大量时间一个慢盘。我可以在 C# 中使用 async await 来做到这一点,这正是我在这里想要做的。产生一个线程或任务并让它做自己的事情,而我继续执行程序并让它在准备好时返回结果。我遇到的 TBB 的问题是,我可以制作的所有任务都认为它们是为 CPU 密集型工作而创建的。

在这种情况下,TBB 调用的 GUI 线程是我想要的吗?我需要不止一个,这可能吗?你能指出我正确的方向吗?我应该寻找另一个提供线程并且可用于多个操作系统的库吗?

【问题讨论】:

  • 我可以轻松创建线程和任务,但我无法让他们明白他们不应该独占 CPU,而是尽可能轻松地工作,因为他们的工作大多只是坐在那里等待可能需要数百毫秒的外部响应。我在上面的问题中已经说过了。 Tltr:线程/任务/???用于非 CPU 密集型任务。怎么做,在哪里可以找到信息。
  • 如果它应该只是等待,那么它根本不应该使用 CPU,无论您使用什么线程模型。你在等什么?还等什么呢?

标签: c++ multithreading async-await intel tbb


【解决方案1】:

任何 I/O 阻塞活动都无法通过任务进行建模——因为任务是为了完成任务,所以这不是任务的用途。您不会找到任何基于 TBB 任务的方法来规避这一点。由于您想要的是一个线程,并且您希望它或多或少地与您已经拥有的其他 TBB 代码一起工作,因此只需使用 TBB's native thread class 来解决问题,就像使用任何其他线程 API 一样。您不需要在这个 TBB 管理的线程上设置优先级或其他任何内容,因为它会进行阻塞调用,然后在资源可用之前不再占用任何时间。

【讨论】:

    【解决方案2】:

    在 TBB 中,我唯一能想到的就是可以为任务分配优先级。但这与线程优先级不同。 TBB 任务优先级仅决定何时从就绪池中选择任务,但正如您所说 - 一旦任务运行,预计它会努力工作。使用它来解决您提到的问题的方法是将您的 IO 工作分成段,然后将它们作为一系列(相关)低优先级任务提交到工作池中。但我不认为这会解决你真正的问题......

    您提到的 GUI 线程是 TBB 模式文档中的一种模式,它说明了如何卸载任务,然后等待回调发出完成的信号。它与异步并没有完全不同。我认为这也不能解决您的问题。

    我认为对你来说最好的方法是创建一个操作系统级线程。那是 Linux 上的 pthreads 或 Windows 上的 windows 线程。然后你会想在上面调用它:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686277(v=vs.85).aspx ...如果你碰巧在 C++11 中,你可以使用 std::thread 来创建线程,然后调用 thread::native_handle 来获取调用 Windows API 设置优先级的句柄。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      相关资源
      最近更新 更多