博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自旋锁-SpinLock(.NET 4.0+)
阅读量:6982 次
发布时间:2019-06-27

本文共 3211 字,大约阅读时间需要 10 分钟。

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

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

foo1:使用系统的自旋锁。

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

foo5:通过Interlocked实现自旋锁。

1    public class SpinLockDemo  2     {  3         int i = 0;  4         List
li = new List
(); 5 SpinLock sl = new SpinLock(); 6 int signal = 0; 7 8 public void Execute() 9 { 10 foo1(); 11 //li.ForEach((t) => { Console.WriteLine(t); }); 12 Console.WriteLine("Li Count - Spinlock: "+li.Count); 13 li.Clear(); 14 foo4(); 15 Console.WriteLine("Li Count - Nolock: " + li.Count); 16 li.Clear(); 17 foo5(); 18 Console.WriteLine("Li Count - Customized Spinlock: " + li.Count); 19 20 } 21 22 public void foo1() 23 { 24 Parallel.For(0, 10000, r => 25 { 26 bool gotLock = false; //释放成功 27 try 28 { 29 sl.Enter(ref gotLock); //进入锁 30 //Thread.Sleep(100); 31 if (i == 0) 32 { 33 i = 1; 34 li.Add(r); 35 i = 0; 36 } 37 } 38 finally 39 { 40 if (gotLock) sl.Exit(); //释放 41 } 42 43 }); 44 } 45 46 public void foo4() 47 { 48 Parallel.For(0, 10000, r => 49 { 50 if (i == 0) 51 { 52 i = 1; 53 li.Add(r); 54 i = 0; 55 } 56 }); 57 } 58 59 public void foo5() 60 { 61 Parallel.For(0, 10000, r => 62 { 63 while (Interlocked.Exchange(ref signal, 1) != 0)//加自旋锁 64 {} 65 li.Add(r); 66 Interlocked.Exchange(ref signal, 0); //释放锁 67 }); 68 69 } 70 71 public void foo6() 72 { 73 //Console.WriteLine(i); 74 //Task.Run(new Action(foo2)).ContinueWith(new Action
(t => 75 //{ 76 // Console.WriteLine("foo2 completed: " + i); 77 //})); 78 //Console.WriteLine(i); 79 //Task.Run(new Action(foo2)).ContinueWith(new Action
(t => 80 //{ 81 // Console.WriteLine("foo3 completed: " + i); 82 //})); 83 //Console.WriteLine(i); 84 } 85 public void foo2() 86 { 87 bool lck = false; 88 sl.Enter(ref lck); 89 Thread.Sleep(100); 90 ++i; 91 if (lck) sl.Exit(); 92 } 93 94 public void foo3() 95 { 96 bool lck = false; 97 sl.Enter(ref lck); 98 ++i; 99 if (lck) sl.Exit();100 }101 }

 

结果如下:

 

转载地址:http://tjtpl.baihongyu.com/

你可能感兴趣的文章
《中国人工智能学会通讯》——11.65 双重代价敏感的属性分类模型
查看>>
阿里云人工智能ET夺肺结节诊断世界冠军
查看>>
研究人员发现利用Excel宏可发起跳板攻击
查看>>
绿盟科技发布OpenSSL高危漏洞技术分析与防护方案 G20成员国美国、中国、德国受影响较大...
查看>>
《VMware Virtual SAN权威指南》一2.2.4 容量层设备
查看>>
物联网发展年报显示 2016年智能家居市场快速增长
查看>>
如何在React中做到jQuery-free
查看>>
4G+宽带高歌猛进:移动双线虐杀联通
查看>>
带你了解超大规模数据中心究竟有何不同?
查看>>
用Python实现每秒处理120万次HTTP请求
查看>>
Android单元测试 - 几个重要问题
查看>>
DNS服务器不能响应的四大解决办法
查看>>
美国税局再遭攻击:原是偷来的社会安全号码作祟
查看>>
如何在Kali Linux中安装Google Chrome浏览器
查看>>
勒索软件防不胜防? 要先从了解它开始
查看>>
大数据精准医疗解读遗传密码 未来医疗健康的变革
查看>>
神经网络基础:七种网络单元,四种层连接方式
查看>>
2014末,Surface Pro 3叫好不叫座只是价格问题?
查看>>
Arimo利用Alluxio的内存能力提升深度学习模型的结果效率(Time-to-Result)
查看>>
代号“沙尘暴”:黑客剑指日本关键基础设施
查看>>