线程同步——SpinLock

作者:追风剑情 发布于:2017-9-25 20:40 分类:C#

当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程就循环等待。

优点:不会使线程进入阻塞状态,没有上下文切换。
缺点:循环等待消耗CPU。

自旋锁(SpinLock)使用场景:
① 多核CPU
② "事务"粒度小,很快处理完成
③ 自旋锁中的代码块不要使用Sleep(),因为一但休眠,就没法再次被自动唤醒。

示例: FCL的自旋锁


using System;
using System.Threading;

namespace SpinLockTest
{
    class Program
    {
        //锁对象不能标记为readonly,因为在操作锁的时候,它的内部状态必须改变。
        static SpinLock spinLock = new SpinLock(true);

        static void Main(string[] args)
        {
            Thread myThread;
            for (int i = 0; i < 5; i++)
            {
                myThread = new Thread(new ThreadStart(MyThreadProc));
                myThread.Name = String.Format("Thread{0}", i + 1);
                myThread.IsBackground = true;
                myThread.Start();
            }

            Console.ReadKey();
        }

        private static void MyThreadProc()
        {
            bool lockTaken = false;
            spinLock.Enter(ref lockTaken);
            if (lockTaken)
            {
                Console.WriteLine("{0} Thread Taken Lock", Thread.CurrentThread.Name);
            }
            else
            {
                Console.WriteLine("{0} Thread Not Taken Lock", Thread.CurrentThread.Name);
            }
            spinLock.Exit(false);
            Console.WriteLine("{0} Thread Exit", Thread.CurrentThread.Name);
        }
    }
}


运行测试

111111.png

标签: C#

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号