在进行多线程开发时,我们经常会用到Thread.Sleep(timeout_ms)来等待或者腾出时间来让其他线程处理。不过,即使我们把timeout_ms设置为0,Thread.Sleep还是会执行等待操作。这就让人很纳闷了,我明明指定的等待时间是0毫秒,为什么还会执行等待呢?
这时因为当我们调用Thread.Sleep时,是让内核暂停处理当前的线程,然后再看需要等待多久,当发现等待时间是timeout_ms时,就等待timeout_ms长的时间,然后内核继续运行该线程。即使timeout_ms为0,由于这个过程中内核已经执行了暂停和恢复的动作,所以会消耗时间。这样也就说明了,即时Thread.Sleep等待的时候是0,还是会有等待的过程。
而如果使用自旋等待就会不一样。下面先看一下代码和执行结果。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
namespace SpinWaitTest
{
class Program
{
private static int _count = 1000;
private static int _timeout_ms = 10;
static void Main(string[] args)
{
//NoSleep();
ThreadSleepInThread();
SpinWaitInThread();
Console.ReadLine();
}