.net 4.0新特性-自旋锁(SpinLock)

来源:互联网 发布:网络直播室 编辑:程序博客网 时间:2024/05/16 23:58

概念:

http://baike.baidu.com/view/1250961.htm?fr=ala0_1_1

http://blog.csdn.net/wzhwho/archive/2009/05/15/4190090.aspx

参考:
http://msdn.microsoft.com/zh-cn/library/dd460716.aspx
http://www.cnblogs.com/lengleng3898/archive/2010/04/20/dotnet_4_parallel_plinq_2.html

http://www.cnblogs.com/prime/articles/1632670.html :) 很不错

msdn代码示例
比较了两种锁的效率
先用Monitor再决定是否用SpinLock

using System;using System.Collections.Generic;using System.Diagnostics;using System.Threading;using System.Threading.Tasks;class SpinLockDemo2{    const int N = 100000;    static Queue<Data> _queue = new Queue<Data>();    static object _lock = new Object();    static SpinLock _spinlock = new SpinLock();    class Data    {        public string Name { get; set; }        public double Number { get; set; }    }    static void Main(string[] args)    {        // First use a standard lock for comparison purposes.        UseLock();        _queue.Clear();        UseSpinLock();        Console.WriteLine("Press a key");        Console.ReadKey();    }    private static void UpdateWithSpinLock(Data d, int i)    {        bool lockTaken = false;        try        {            _spinlock.Enter(ref lockTaken);            _queue.Enqueue(d);        }        finally        {            if (lockTaken) _spinlock.Exit(false);        }    }    private static void UseSpinLock()    {        Stopwatch sw = Stopwatch.StartNew();        Parallel.Invoke(                () =>                {                    for (int i = 0; i < N; i++)                    {                        UpdateWithSpinLock(new Data() { Name = i.ToString(), Number = i }, i);                    }                },                () =>                {                    for (int i = 0; i < N; i++)                    {                        UpdateWithSpinLock(new Data() { Name = i.ToString(), Number = i }, i);                    }                }            );        sw.Stop();        Console.WriteLine("elapsed ms with spinlock: {0}", sw.ElapsedMilliseconds);    }    static void UpdateWithLock(Data d, int i)    {        lock (_lock)        {            _queue.Enqueue(d);        }    }    private static void UseLock()    {        Stopwatch sw = Stopwatch.StartNew();        Parallel.Invoke(                () =>                {                    for (int i = 0; i < N; i++)                    {                        UpdateWithLock(new Data() { Name = i.ToString(), Number = i }, i);                    }                },                () =>                {                    for (int i = 0; i < N; i++)                    {                        UpdateWithLock(new Data() { Name = i.ToString(), Number = i }, i);                    }                }            );        sw.Stop();        Console.WriteLine("elapsed ms with lock: {0}", sw.ElapsedMilliseconds);    }}

输出
在短时间占用资源的情况下,差别很大
image
原创粉丝点击