线程基础示例代码之SpinWait

2018-06-26  本文已影响0人  JameLee

我们在处理一个线程时,若需要同步等待时,以往可能会常用 Thread.SleepCPU时间让给其他线程使用。但如果需要等待某个条件满足的时间很短,而且不希望发生上下文切换,基于自旋的【等待】是一种很好的解决方案

如果发生了长时间的自旋,SpinWait会让出底层的时间片,并触发上下文切换。

因为长时间的自旋会阻塞优先级更高的线程。当一个线程自旋时,它会将一个内核放入到一个繁忙的循环中,而且它不会让出处理器时间片的剩余部分。

SpinWait的智能逻辑中会在自旋达到足够长的时间时停止自旋并让出处理器。当然可以考虑调用Thread.Sleep()方法,它会让出处理器时间,但开销比较大。

示例代码如下

using System;
using System.Threading;
using System.Threading.Tasks;

public class App {
    private static bool isEnvironmentInit = false;

    /// <summary>
    /// 模拟环境初始化之后需要做的工作
    /// </summary>
    private static void DoWork() {
        SpinWait.SpinUntil(() => isEnvironmentInit);
        Console.WriteLine("环境已在主线程中初始化...");

        {
            // 业务逻辑代码
            Console.WriteLine("业务逻辑代码...");
        }
    }

    static void Main(string[] args) {
        Task.Run(() => {
            DoWork();
        });

        // 模拟环境初始化过程
        Thread.Sleep(3000);
        isEnvironmentInit = true;

        Console.WriteLine("环境初始化完成");
        Console.ReadLine();
    }
}

运行结果如下

环境初始化完成
环境已在主线程中初始化...
业务逻辑代码...

欢迎关注公众号【嘿嘿的学习日记】,所有的文章,都会在公众号首发,Thank you~


公众号二维码.jpg
上一篇下一篇

猜你喜欢

热点阅读