您的位置:首页 > 移动开发 > Objective-C

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

2010-06-10 10:08 288 查看
概念:
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再决定是否用SpinLockusing 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);
}
}

输出
在短时间占用资源的情况下,差别很大


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息