SpinWait的性能高于Thread.Sleep

在多线程开发中,SpinWait相比Thread.Sleep表现出更好的性能。即使在timeout_ms为0的情况下,Thread.Sleep仍会有等待过程,消耗时间。SpinWait通过自旋等待,只有在条件不满足时才进入内核等待,从而减少了不必要的线程暂停和恢复操作,提高了程序执行效率。
摘要由CSDN通过智能技术生成

在进行多线程开发时,我们经常会用到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();
        }

     
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值