核心2到期处理器可以处理多少个infinte循环?我想知道...
我正在开发一个软件,我必须在内部有2个infinte循环,如do{
//code
}while(true);
我想知道它是否有助于在while体内插入thread.sleep(x)
以释放处理器上的压力,如果这是真的x应该是多少?
答案 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
,则更是如此,这会通知操作系统您希望让其他线程继续运行。