短时间锁定的情况下,自旋锁(spinlock)更快。(因为自旋锁本质上不会让线程休眠,而是一直循环尝试对资源访问,直到可用。所以自旋锁线程被阻塞时,不进行线程上下文切换,而是空转等待。对于多核CPU而言,减少了切换线程上下文的开销,从而提高了性能。)

以下是简单实例(并行执行10000次,每次想list中添加一项。执行完后准确的结果应该是10000):

foo1:使用系统的自旋锁。

foo4:不使用锁。结果必然是不正确的。

foo5:通过Interlocked实现自旋锁。

    public class SpinLockDemo
{
int i = ;
List<int> li = new List<int>();
SpinLock sl = new SpinLock();
int signal = ; public void Execute()
{
foo1();
//li.ForEach((t) => { Console.WriteLine(t); });
Console.WriteLine("Li Count - Spinlock: "+li.Count);
li.Clear();
foo4();
Console.WriteLine("Li Count - Nolock: " + li.Count);
li.Clear();
foo5();
Console.WriteLine("Li Count - Customized Spinlock: " + li.Count); } public void foo1()
{
Parallel.For(, , r =>
{
bool gotLock = false; //释放成功
try
{
sl.Enter(ref gotLock); //进入锁
//Thread.Sleep(100);
if (i == )
{
i = ;
li.Add(r);
i = ;
}
}
finally
{
if (gotLock) sl.Exit(); //释放
} });
} public void foo4()
{
Parallel.For(, , r =>
{
if (i == )
{
i = ;
li.Add(r);
i = ;
}
});
} public void foo5()
{
Parallel.For(, , r =>
{
while (Interlocked.Exchange(ref signal, ) != )//加自旋锁
{}
li.Add(r);
Interlocked.Exchange(ref signal, ); //释放锁
}); } public void foo6()
{
//Console.WriteLine(i);
//Task.Run(new Action(foo2)).ContinueWith(new Action<Task>(t =>
//{
// Console.WriteLine("foo2 completed: " + i);
//}));
//Console.WriteLine(i);
//Task.Run(new Action(foo2)).ContinueWith(new Action<Task>(t =>
//{
// Console.WriteLine("foo3 completed: " + i);
//}));
//Console.WriteLine(i);
}
public void foo2()
{
bool lck = false;
sl.Enter(ref lck);
Thread.Sleep();
++i;
if (lck) sl.Exit();
} public void foo3()
{
bool lck = false;
sl.Enter(ref lck);
++i;
if (lck) sl.Exit();
}
}

结果如下:

自旋锁-SpinLock(.NET 4.0+)的更多相关文章

  1. 自旋锁spinlock

    1 在单处理器上的实现 单核系统上,不存在严格的并发,因此对资源的共享主要是多个任务分时运行造成的. 只要在某一时段,停止任务切换,并且关中断(对于用户态应用程序,不大可能与中断处理程序抢临界区资源) ...

  2. 自旋锁spinlock解析

    1 基础概念 自旋锁与相互排斥锁有点类似,仅仅是自旋锁不会引起调用者睡眠.假设自旋锁已经被别的运行单元保持.调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁."自旋"一词就 ...

  3. SpinLock 自旋锁, CAS操作(Compare & Set) ABA Problem

    SpinLock 自旋锁 spinlock 用于CPU同步, 它的实现是基于CPU锁定数据总线的指令. 当某个CPU锁住数据总线后, 它读一个内存单元(spinlock_t)来判断这个spinlock ...

  4. SpinLock(自旋锁)

    SpinLock(自旋锁) SpinLock 结构是一个低级别的互斥同步基元,它在等待获取锁时进行旋转. 在多核计算机上,当等待时间预计较短且极少出现争用情况时,SpinLock 的性能将高于其他类型 ...

  5. LiteOS:SpinLock自旋锁及LockDep死锁检测

    摘要:除了多核的自旋锁机制,本文会介绍下LiteOS 5.0引入的LockDep死锁检测特性. 2020年12月发布的LiteOS 5.0推出了全新的内核,支持SMP多核调度功能.想学习SMP多核调度 ...

  6. Linux内核同步:自旋锁

    linux内核--自旋锁的理解 自旋锁:如果内核配置为SMP系统,自旋锁就按SMP系统上的要求来实现真正的自旋等待,但是对于UP系统,自旋锁仅做抢占和中断操作,没有实现真正的“自旋”.如果配置了CON ...

  7. 【APUE】信号量、互斥体和自旋锁

    http://www.cnblogs.com/biyeymyhjob/archive/2012/07/21/2602015.html http://blog.chinaunix.net/uid-205 ...

  8. 菜鸟nginx源代码剖析数据结构篇(十) 自旋锁ngx_spinlock

    菜鸟nginx源代码剖析数据结构篇(十) 自旋锁ngx_spinlock Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.cs ...

  9. 多线程之美6一CAS与自旋锁

    1.什么是CAS CAS 即 compare and swap 比较并交换, 涉及到三个参数,内存值V, 预期值A, 要更新为的值B, 拿着预期值A与内存值V比较,相等则符合预期,将内存值V更新为B, ...

随机推荐

  1. Spark-1.0.1 的make-distribution.sh编译、SBT编译、Maven编译 三种编译方法

    fesh个人实践,欢迎经验交流!本文Blog地址:http://www.cnblogs.com/fesh/p/3775343.html 本文编译方法所支持的hadoop环境是Hadoop-2.2.0, ...

  2. Origin9.1如何绘制风向玫瑰图(Binned Data)?

    Origin9.1如何绘制风向玫瑰图(Binned Data)? 时间:2014/5/14 21:02:44 点击: 2624 核心提示:今天为大家介绍下如何使用Origin9.1绘制如下图所示的风向 ...

  3. nil、Nil、NULL和NSNull的区别和联系

    一.nil 我们给对象赋值时一般会使用object = nil,表示我想把这个对象释放掉: 或者对象由于某种原因,经过多次release,于是对象引用计数器为0了,系统将这块内存释放掉,这个时候这个对 ...

  4. acm入门编成题

    http://wenku.baidu.com/view/c8f2f64acf84b9d528ea7aee.html

  5. 烧写AT91Bootstrap不能连接SAM-BA的解决方法

    AT91与SAM-BA的连接是由于芯片内有一段固化的代码运行起来后才会检测到目标板并建立连接.    假设现在你烧写了Bootstrap进去,芯片上电后发现有可运行的代码,从而就不执行片内固化的那个代 ...

  6. Spring+Struts2/Hibernate 学习笔记

    ============Spring与Struts2整合============ (1)拷JAR包(Spring.Struts2) (2)配置org.springframework.web.conte ...

  7. 基于选择重传ARQ传输协议的数据重传机制方案设计

    原文链接: http://blog.csdn.net/pinghegood/article/details/7841281  1.背景 最近在项目中,由于使用TD网络传输数据,数据掉包严重,软件组老大 ...

  8. UWP深入学习四:动画及图像

    Storyboarded animations Key-frame animations and easing function animations 缓动函数 缓动函数支持你将自定义数学公式应用到动 ...

  9. 关于HTML5代码总结。

    在阅读完HTML5后,自己把一些常用的代码总结了一下,自认为比较全,如果有什么错误请指出. 1.<!DOCTYPE html>声明这是一个HTML5的页面 2.<HTML lang= ...

  10. 【洛谷P1969】积木大赛

    递增区间内累计增量 #include<cstdio> #include<cstring> using namespace std; int a,h,n,ans; int mai ...