我试图通过让一个线程写入到一个链表而另一个线程进程链表加速的东西。
出于某种原因,如果写入到链表我使之成为一项任务,即从链表低优先级的线程程序读取方法的方法完成整体快得多。 换句话说,我experiense fastests结果时做:
Task.Factory.StartNew( AddItems );
new Thread( startProcessingItems ) { Priority = ThreadPriority.Lowest }.Start();
while(completed==false)
Thread.Sleep(0);
也许是因为第一个任务是做的比其他线程,这就是为什么一切作为一个整体将更快地完成,如果我设定的第二种方法低优先级这么多的工作。
反正现在我的问题是 startProcessingItems
与ThreadPriority =最低运行。 我怎么会改变它的优先级到最高? 如果我创建该方法的新任务将它与低优先级运行? 基本上startProcessingItems与列表结束,一旦有这单子,我会想开始具有最高优先级执行。
这是不是一个好方法。 首先, LinkedList<T>
不是线程安全的,所以写它,并在两个线程从中读取会导致竞争条件。
更好的方法是使用BlockingCollection<T>
这可以让你无需担心线程安全添加项目(生产线),并阅读项目(消费者线程),因为它是完全线程安全的。
读线程可以叫blockingCollection.GetConsumingEnumerable()
中foreach
得到的元素,写线程只是增加了他们。 读线程会自动拦截 ,所以没有必要惹的优先级。
当写线程是“做”,你只需要调用CompleteAdding
,这将反过来,让读线程自动完成。
您可以通过改变固有的设计,而不是通过改变线程/进程的优先级提高程序的性能。
你的问题的很大一部分是你正在做一个busywait:
while(completed==false)
Thread.Sleep(0);
这导致它消耗大量的CPU周期为没有生产工作,这也是为什么降低它的优先级使它执行更快。 如果你不那么忙碌等待,这将不再是一个问题了。
正如里德所说, BlockingCollection
是这种情况进行定制。 你可以有一个生产者线程将使用项目Add
,并使用消费者线程Take
知道该方法只会阻塞,如果没有更多的项目被删除。
您还可以存储Task
创建和使用Task.Result
或Task.Wait
有主线程等待其他任务完成(不浪费CPU周期)。 (如果你正在使用线程直接就可以使用Join
。)
除了里德什么和Servy说:
线程的优先级相对于进程的优先级。
Windows计划考虑到了所有其他线程,当它安排时间线程。 具有较高优先级的线程需要时间远离其他线程可能在系统的其余部分人为放慢。 它不喜欢的系统没有理由不给你更多的线程优先级。 优先级将才有效,如果别的东西接过CPU远离它 - 它发生的原因。 如果没有从线程接过CPU了,也不会神奇地以最高优先级运行得更快。
线程优先级设置为最高,几乎总是错误的做法。
可能是两个线程之间的同步的开销会杀了你认为你可能得到的任何性能增益。
此外,的Thread.Sleep(0)放弃只有时间相同优先级的线程和准备运行 - 这可能导致线程匮乏。 http://msdn.microsoft.com/en-us/library/d00bd51t(v=vs.80).aspx