处理器线程C#

时间:2010-11-01 11:04:36

标签: c# multithreading thread-safety

核心2到期处理器可以处理多少个infinte循环?我想知道...

我正在开发一个软件,我必须在内部有2个infinte循环,如

do{
//code
}while(true);

我想知道它是否有助于在while体内插入thread.sleep(x)以释放处理器上的压力,如果这是真的x应该是多少?

6 个答案:

答案 0 :(得分:3)

在进程的地址空间耗尽之前,您应该能够在自己的线程中运行大约2000个循环。但请参阅"If you have to ask, you're probably doing something wrong"

答案 1 :(得分:2)

这取决于你想要做什么。如果要占用100%的CPU时间,请不要插入任何Sleep()。在其他情况下,插入一些您认为合适的值 - 例如,执行10毫秒的工作,然后执行Sleep() 10毫秒。这样你就不会杀死你的CPU和操作系统将有一些杠杆来决定如何安排工作。

AFAIK,10毫秒是Windows上最小的计划间隔。此外,您可以选择Sleep(0)仅通知内核(在本例中为托管线程管理器)您希望其他人轮流处理。

答案 2 :(得分:1)

如果您只想在某个执行点执行另一个线程,那么:

x应为0或1。

但: 如果0具有相同的更高优先级,则0将仅导致执行另一个线程。 1将强制执行另一个线程。

答案 3 :(得分:1)

除非线程主体正在调用阻塞函数(例如读取套接字),否则需要进行休眠。在任何其他情况下,你需要调用sleep,否则你的线程将使用100%的一个cpu,耗尽资源。

关于x应该取决于线程处理的内容(需要多长时间处理)。

答案 4 :(得分:0)

您也可能尝试降低这些线程的优先级,以便您的GUI线程(如果存在)和其他应用程序不会冻结。

答案 5 :(得分:0)

在任何情况下,现代操作系统都会抢先管理线程,这意味着如果线程处于无限循环中,则可以暂停操作系统并在该核心上运行另一个线程/进程。这意味着您可以拥有任意数量的具有无限循环的线程,操作系统将负责调度。如果执行Thread.Sleep,则更是如此,这会通知操作系统您希望让其他线程继续运行。