短时间锁定的情况下,自旋锁(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. HTML 透明、阴影,圆角等知识点

     table两个属性:cellpadding:内容与单元格边框的距离,内部距离cellspacing:单元格之间的距离,外部距离    table合并边框线:  border-collapse: co ...

  2. 如何用Jquery实现 ,比如点击图片之后 ,该图片变成向下的箭头,再点击向下箭头的图片 又变成原始图片呢

    <!DOCTYPE html><html><head><meta charset="utf-8" /><title>切换 ...

  3. 记一次 Ubuntu 使用 arptables 抵御局域网 ARP 攻击

    . . . . . 前段时间大概有一个月左右,租房的网络每天都断一次,每次断大概一两分钟左右就恢复了,所以没太在意.直到有一天晚上,LZ 正在写博客,但是网络频繁中断又重新连上再中断.待 LZ 好不容 ...

  4. 开源PLM软件Aras详解二 汉化以及界面

    Aras安装完毕之后,默认语言为英语,对于国内很多制造业并不适用,那么下面就来说说如何汉化 首先下载汉化包:zh-cn_languagepack-110v3.zip 步骤如下: 步骤1- 设定安装程序 ...

  5. Java 技术体系图

    Java 程序员 高级特性 反射.泛型.注释符.自动装箱和拆箱.枚举类.可变 参数.可变返回类型.增强循环.静态导入 核心编程 IO.多线程.实体类. 集合类.正则表达式. XML 和属性文件 图形编 ...

  6. jQuery.cookie

    了解cookie先了解一下知识点: Navigator (一般是浏览器)对象包含有关浏览器的信息. Navigator userAgent:是一个只读字符串,声明了浏览器用于HTTP请求的用户代理头的 ...

  7. AngularJs自定义指令详解(3) - scope

    我们之所以要定义指令,目的是重用指令.假设有这么一个应用场景:在同一个html里使用了两次my-directive,第一个my-directive要展示的是Hello World,第二个my-dire ...

  8. 浅谈TCP/IP网络编程中socket的行为

    我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: 1. TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) 2. Socket I/O系统 ...

  9. Git常用命令(自己总是忘记,整理在这里)

    1.git init    初始化一个空的git仓库 2.git clone +SSH地址    clone新的项目到本地 3.git add     git add file 4.git commi ...

  10. IOS 导航栏

    系统状态栏改为白色:在Supporting Files文件的info.plist文件中添加 新的key,名字为View controller-based status bar appearance,并 ...