zoukankan      html  css  js  c++  java
  • 【C#】【Thread】SpinLock

       SpinLock结构是一个低级别的互斥同步基元,它在等待获取锁时进行旋转。 在多核计算机上,当等待时间预计较短且极少出现争用情况时,SpinLock 的性能将高于其他类型的锁。 不过,我们建议您仅在通过分析确定 System.Threading.Monitor 方法或 Interlocked 方法显著降低了程序的性能时使用 SpinLock。
          即使 SpinLock 未获取锁,它也会产生线程的时间片。 它这样做是为了避免线程优先级别反转,并使垃圾回收器能够继续执行。 在使用 SpinLock 时,请确保任何线程持有锁的时间不会超过一个非常短的时间段,并确保任何线程在持有锁时不会阻塞。
          由于 SpinLock 是一个值类型,因此,如果您希望两个副本都引用同一个锁,则必须通过引用显式传递该锁。

    public void SpinLockTest()
            {
                SpinLock sLock = new SpinLock();
                StringBuilder sb = new StringBuilder();
                Action action = () =>
                {
                    bool gotLock = false;
                    for (int i = 0; i < 100; i++)
                    {
                        gotLock = false;
                        try
                        {
                            sLock.Enter(ref gotLock);//加锁
                            sb.Append(i.ToString());
                        }
                        finally
                        {
                            //真正获取之后,才释放
                            if (gotLock) sLock.Exit();//解锁
                        }
                    }
                };
    
                //多线程调用action
                Parallel.Invoke(action, action, action);
                Console.WriteLine("输出:{0}",sb.ToString());
            }
  • 相关阅读:
    生成排列与生成子集
    赛后总结AtCoder Beginner Contest 090(Beginner)
    树状数组笔记
    论怎么记住tarjan的板子
    tarjan缩点-受欢迎的牛-笔记
    tarjan模板(%%%hzwer)-2.0
    tarjan模板(%%%hzwer)
    匈牙利算法学习笔记
    最短路-Car的旅行路线
    数据结构 笔记1 搜索树
  • 原文地址:https://www.cnblogs.com/mqxs/p/6237095.html
Copyright © 2011-2022 走看看