2014-01-17 59 views
2

我想要创建一个线程或任务(确切地说有多个),并执行一些非CPU密集型工作,这会由于外部原因(如HTTP请求或文件IO操作)而花费大量时间。慢速磁盘。我可以用C#中的异步等待来做到这一点,而这正是我在这里要做的。产生一个线程或任务,让它做它自己的事情,而我继续执行该程序,只要让它在任何准备就绪的时候返回结果。 TBB存在的问题是我所能做的所有任务都认为它们是为CPU密集型工作而创建的。如何在英特尔®TBB中有漫长的等待线程?

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

+0

我可以轻松创建线程和任务,但我无法让他们明白他们不应该垄断CPU,而是尽可能轻地工作,因为他们的工作主要是坐在那里等待可能需要的外部响应几百毫秒。我说那已经在上面的问题里面了。 Tltr:threads/task/???对于非CPU密集型任务。如何做到这一点,在哪里可以找到信息。 – SMeyers

+0

如果应该只是在等待,那么它根本不应该使用CPU,无论使用的是什么线程模型。你在等什么?你最近怎么样? –

回答

1

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

你提到的GUI线程是TBB模式文件中的一种模式,它说明如何卸载一个任务,然后等待回调来表示它已完成。它与异步并不完全不同。我不认为这也解决了你的问题。

我认为这里最好的方法就是创建一个OS级别的线程。这是Linux上的线程或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来设置优先级。

2

任何I/O阻塞活动都很难通过任务建模 - 因为任务只能运行到完成,而不是任务的目的。你不会找到任何TBB基于任务的方法来避免这种情况。既然你想要的是一个线程,并且你希望它与你已有的其他TBB代码或多或少地一起工作,只需使用TBB's native thread class即可解决问题,就像使用任何其他线程API一样。您无需在此TBB管理的线程上设置优先级或其他任何内容,因为它会进入阻塞呼叫,然后在资源可用之前不会占用更多时间。