2013-08-21 34 views
2

here.Net 4任务的调度澄清?

.NET Framework提供每个工作线程 在线程pool.Giving应用自己 工作队列有助于避免中央瓶颈的不同部分本地任务队列(通过不访问全局队列)。

enter image description here

我认为这些队列是它来源于工作线程,而不是从一个普通线程的新任务。

问:

但为什么队列(每个工作线程)在LIFO方式运行的本地任务?公平在哪里? 较早排队的任务应该较早运行(FIFO)。

我错过了什么?

+1

任务班确实受到宇航员建筑师的掌握。这里没有什么特别的,你用ContinueWith()添加的子任务按顺序运行。 –

回答

3

刚刚排队的任务可能将其工作集的内存仍保留在CPU高速缓存中(例如,快速排序递归排队要排序的数组部分)。 LIFO促进缓存重用并降低公平性。但TPL无论如何不能保证公平,而且我看到很少有需要这样的应用程序。

+1

如果你想要公平,有[TaskCreationOptions.PreferFairness](http://blogs.msdn.com/b/pfxteam/archive/2009/07/07/9822857.aspx)(它把“任务”到全局FIFO队列)。 – svick

+0

@svick你是说如果我打开一个子任务(从工作者线程)并设置“PreferFairness”,它会进入全局队列? (我认为它应该去本地队列) –

+0

@RoyiNamir是的,这正是该选项的用途(请阅读我链接到的文章)。 – svick