美文网首页
线程基础示例代码之SpinWait

线程基础示例代码之SpinWait

作者: JameLee | 来源:发表于2018-06-26 23:07 被阅读0次

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

    • SpinWait : 自旋等待
    • SpinUntil : 等待某个条件发生

    如果发生了长时间的自旋,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

    相关文章

      网友评论

          本文标题:线程基础示例代码之SpinWait

          本文链接:https://www.haomeiwen.com/subject/gsjvyftx.html