Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将.net中的线程优先级从最低更改为最高_C#_Multithreading_Parallel Processing_Thread Priority - Fatal编程技术网

C# 将.net中的线程优先级从最低更改为最高

C# 将.net中的线程优先级从最低更改为最高,c#,multithreading,parallel-processing,thread-priority,C#,Multithreading,Parallel Processing,Thread Priority,我试图通过让一个线程写入链表,另一个线程处理链表来加快速度 出于某种原因,如果将写入链表的方法放入任务中,而从链表中读取的方法是低优先级线程,那么程序作为一个整体完成的速度要快得多。换句话说,我在做以下事情时体验到最快的结果: Task.Factory.StartNew( AddItems ); new Thread( startProcessingItems ) { Priority = ThreadPriority.Lowest }.Start(); while(completed

我试图通过让一个线程写入链表,另一个线程处理链表来加快速度

出于某种原因,如果将写入链表的方法放入任务中,而从链表中读取的方法是低优先级线程,那么程序作为一个整体完成的速度要快得多。换句话说,我在做以下事情时体验到最快的结果:

 Task.Factory.StartNew( AddItems );

 new Thread( startProcessingItems ) { Priority = ThreadPriority.Lowest }.Start();

 while(completed==false)
    Thread.Sleep(0);
可能是因为第一个任务比另一个线程做了太多额外的工作,这就是为什么如果我将第二个方法设置为低优先级,那么所有事情作为一个整体都会完成得更快


无论如何,现在我的问题是
startProcessingItems
以ThreadPriority=Lowest运行。如何将其优先级更改为最高?如果我在该方法中创建一个新任务,它会以低优先级运行吗?基本上,startProcessingItems以一个列表结束,一旦它有了这个列表,我将以最高优先级开始执行

这不是一个好方法。首先,
LinkedList
不是线程安全的,因此在两个线程中对其进行写入和读取将导致争用情况

更好的方法是使用。这允许您添加项目(生产者线程)和读取项目(消费者线程),而不必担心线程安全,因为它是完全线程安全的

读取线程只需在
foreach
中调用
blockingCollection.getConsumineumerable()
即可获取元素,而写入线程只需添加元素。阅读线程将自动阻塞,因此没有必要弄乱优先级


当写入线程“完成”时,您只需调用
completedadding
,这将允许读取线程自动完成。

您可以通过更改固有设计而不是更改线程/进程优先级来提高程序的性能

你的问题很大一部分是你在忙着等待:

while(completed==false)
    Thread.Sleep(0);
这会导致it在没有生产性工作的情况下消耗大量CPU周期,这就是为什么降低it优先级会使其执行更快。如果你不忙着等待,那就不再是问题了

正如里德所建议的那样,
BlockingCollection
是为这种情况量身定做的。您可以让生产者线程使用
Add
添加项目,让消费者线程使用
Take
知道如果没有更多要删除的项目,该方法将简单地阻止


您还可以存储您创建并使用的
任务
结果
任务.Wait
以使主线程等待其他任务完成(而不浪费CPU周期)。(如果您直接使用线程,您可以使用
Join

除了Reed和Servy所说的:

线程优先级相对于进程优先级

Windows计划程序在为线程安排时间时会考虑所有其他线程。具有较高优先级的线程会从其他线程中抽出时间,这可能会人为地减慢系统的其余部分。系统没有理由不给线程更多的优先级。优先级只有在其他东西夺走了CPU时才会起作用——这是有原因的。如果没有任何东西将CPU从线程中带走,它将不会以最高优先级神奇地运行得更快

将线程优先级设置为最高几乎总是错误的

两个线程之间的同步开销可能会扼杀您认为可能获得的任何性能提升


另外,Thread.Sleep(0)只会将时间让给具有相同优先级的线程,并准备好运行——这可能会导致线程不足

每次添加或删除使用该锁的项目时,我都有一个名为listLock的锁。但我想我会用blockingCollection来代替+1.thanks@TonoNam锁定可以解决竞争条件问题,但BC要好得多。它的性能可能也会更好,因为在大多数情况下,新的并发集合比锁定普通集合的性能要好得多。非常感谢。我从这里学到的东西比其他任何地方都多,哈哈。非常感谢。我将使用信号灯代替。但有时在一个线程上,我不得不等待更多的项目出现在列表中。我使用相同的方法等待,直到
item.Next=null
我应该同步线程吗?如果是的话,我该怎么做?我有一个线程在写链接列表,另一个线程在读链接列表并处理项目。@TonoNam正如里德和我所说的,你应该使用
BlockingCollection
。当您使用
Take
时,它将自动等待,直到有一个项目要删除,并且它将确保所有方法都是原子的。