我想创建一个线程或任务(确切地说不止一个)并执行一些非CPU密集型工作,由于外部原因(例如HTTP请求或文件IO操作)需要花费大量时间一个慢盘。我可以用C#中的异步等待来做这件事,这正是我想在这里做的。产生一个线程或任务,并让它自己做,而我继续执行程序,只需让它在准备好后返回结果。 TBB的问题在于我可以认为所有任务都是为CPU密集型工作而创建的。
在这种情况下,TBB是什么叫GUI Thread我想要的?我需要不止一个,这可能吗?你能指出我正确的方向吗?我应该寻找另一个提供线程并可用于多个操作系统的库吗?
答案 0 :(得分:2)
任务的任何I / O阻塞活动都很难建模 - 因为任务要运行完成,而不是任务的任务。您将找不到任何绕过TBB任务的方法。因为你想要的是一个线程,并且你希望它与你已经拥有的其他TBB代码或多或少很好地工作,只需使用TBB's native thread class来解决问题,就像使用任何其他线程API一样。您不需要在此TBB管理的线程上设置优先级或其他任何内容,因为它将进入阻塞调用,然后在资源可用之前不再占用任何时间。
答案 1 :(得分:1)
关于我在TBB中唯一可以想到的事情是可以为任务分配优先级。但这与线程优先级不同。 TBB任务优先级仅指示何时将从就绪池中选择任务,但就像您所说的那样 - 一旦任务运行,预计将会努力工作。使用它来解决您提到的问题的方法是将IO工作分解为段,然后将它们作为一系列(依赖的)低优先级任务提交到工作池中。但我不认为这会解决你真正的问题...
您提到的GUI线程是TBB模式文档中的一种模式,它说明如何卸载任务然后等待回调以表明它已完成。它与异步并不完全不同。我不认为这也解决了你的问题。
我认为这里最好的方法是创建一个OS级别的线程。这是Linux上的Linux或Windows线程上的pthreads。然后你会想要调用它:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686277(v=vs.85).aspx ...如果你碰巧在C ++ 11中,你可以使用std :: thread来创建线程然后调用thread :: native_handle来获取一个句柄来调用Windows API来设置优先级。