.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);
}
}
输出
在短时间占用资源的情况下,差别很大
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);
}
}
输出
在短时间占用资源的情况下,差别很大
相关文章推荐
- .net 4.0新特性-自旋锁(SpinLock)
- MSDN Webcast预告 - .NET 4.0中的新特性系列课程(4):.NET 4.0 安全模型介绍(Level 200)
- .net 4.0 中对多线程新特性(一)
- 自旋锁-SpinLock(.NET 4.0+)
- .net 4.0 中对多线程新特性(二)
- 精进不休 .NET 4.0 (1) - asp.net 4.0 新特性之web.config的改进 推荐
- 精进不休 .NET 4.0 (3) - asp.net 4.0 新特性之动态数据(Dynamic Data)增强
- 精进不休 .NET 4.0 (4) - C# 4.0 新特性之命名参数和可选参数
- 精进不休 .NET 4.0 (5) - C# 4.0 新特性之并行运算(Parallel)
- .net 4.0新特性-延迟初始化:Lazy(转),ThreadLocal<T>
- 精进不休 .NET 4.0 (5) - C# 4.0 新特性之并行运算(Parallel)
- MSDN Webcast预告 - .NET 4.0中的新特性系列课程(4):.NET 4.0 安全模型介绍(Level 200)
- .net 4.0 中的特性总结(一):dynamic
- .net 4.0 中的特性总结(五):并行编程
- 返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作
- .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
- .Net 4.0特性 Tuple元组
- 精进不休 .NET 4.0 (5) - C# 4.0 新特性之并行运算(Parallel)
- .net 4.0新特性-tuple
- 精进不休 .NET 4.0 (6) - ADO.NET Data Services 1.5 新特性