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());
            }
  • 相关阅读:
    splinter webdriver API 的基本实现
    201253 线程和进程的区别
    Winform中的默认图片
    [收藏】正确使用SqlConnection对象,兼谈数据库连接池
    手机相关的基础名称
    常见排序
    SIP相关内容
    How to set the WIFI configuration
    本地化的设置和读取
    Serialize And Deserialize Binary Tree
  • 原文地址:https://www.cnblogs.com/mqxs/p/6237095.html
Copyright © 2011-2022 走看看