c#spinLock使用
一下解释摘自msdn msdn链接
自旋锁可用于叶级锁定,此时在大小方面或由于垃圾回收压力,使用 Monitor 所隐含的对象分配消耗过多。自旋锁非常有助于避免阻塞,但是如果预期有大量阻塞,由于旋转过多,您可能不应该使用自旋锁。当锁是细粒度的并且数量巨大(例如链接的列表中每个节点一个锁)时以及锁保持时间总是非常短时,旋转可能非常有帮助。通常,在保持一个旋锁时,应避免任何这些操作:
阻塞,
调用本身可能阻塞的任何内容,
一次保持多个自旋锁,
进行动态调度的调用(接口和虚方法)
在某一方不拥有的任何代码中进行动态调度的调用,或
分配内存。
SpinLock 仅当您确定这样做可以改进应用程序的性能之后才能使用。另外,务必请注意 SpinLock 是一个值类型(出于性能原因)。因此,您必须非常小心,不要意外复制了 SpinLock 实例,因为两个实例(原件和副本)之间完全独立,这可能会导致应用程序出现错误行为。如果必须传递 SpinLock 实例,则应该通过引用而不是通过值传递。
不要将 SpinLock 实例存储在只读字段中。
实例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace spinLock
{
class Program
{
//得到当前线程的handler
[DllImport("kernel32.dll")]
static extern IntPtr GetCurrentThread();
//创建自旋锁
private static SpinLock spin = new SpinLock();
public static void doWork1()
{
bool lockTaken = false;
try
{
//申请获取锁
spin.Enter(ref lockTaken);
//下面为临界区
for(int i=0;i<10;++i)
{
Console.WriteLine(2);
}
}
finally
{
//工作完毕,或者发生异常时,检测一下当前线程是否占有锁,如果咱有了锁释放它
//以避免出现死锁的情况
if (lockTaken)
spin.Exit();
}
}
public static void doWork2()
{
bool lockTaken = false;
try
{
spin.Enter(ref lockTaken);
for (int i = 0; i < 10; ++i)
{
Console.WriteLine(1);
}
}
finally
{
if (lockTaken)
spin.Exit();
} }
static void Main(string[] args)
{
Thread[] t = new Thread[2];
t[0] = new Thread(new ThreadStart(doWork1));
t[1] = new Thread(new ThreadStart(doWork2));
t[0].Start();
t[1].Start();
t[0].Join();
t[1].Join();
Console.ReadKey();
}
}
}
c#spinLock使用的更多相关文章
- 装逼名词-ABA CAS SpinLock
今天看wiki,看到一个提到什么什么会陷入 race condition & ABA problem.丫的我没听过ABA呀,那么我去搜了一下,如下: http://www.bubuko.com ...
- 【C#】【Thread】SpinLock
SpinLock结构是一个低级别的互斥同步基元,它在等待获取锁时进行旋转. 在多核计算机上,当等待时间预计较短且极少出现争用情况时,SpinLock 的性能将高于其他类型的锁. 不过,我们建议您仅在通 ...
- 锁相关知识 & mutex怎么实现的 & spinlock怎么用的 & 怎样避免死锁 & 内核同步机制 & 读写锁
spinlock在上一篇文章有提到:http://www.cnblogs.com/charlesblc/p/6254437.html 通过锁数据总线来实现. 而看了这篇文章说明:mutex内部也用到 ...
- Linux内核原子(1) - spinlock的实现
spinlock的数据结构spinlock_t定义在头文件linux/spinlock_types.h里面: typedef struct { raw_spinlock_t raw_lock; #if ...
- [20140829]spinlock导致cpu居高不下
背景: 出现cpu高于常规的告警 排查: 1.开跟踪,没有发现cup特别高的查询 2.查看内核cpu使用量,看是否是sql server 端引起 3.查看负荷,是否负荷特别高这里使用 batch re ...
- spinlock原理
[参考] http://www.searchtb.com/2011/06/spinlock%E5%89%96%E6%9E%90%E4%B8%8E%E6%94%B9%E8%BF%9B.html
- 自旋锁-SpinLock(.NET 4.0+)
短时间锁定的情况下,自旋锁(spinlock)更快.(因为自旋锁本质上不会让线程休眠,而是一直循环尝试对资源访问,直到可用.所以自旋锁线程被阻塞时,不进行线程上下文切换,而是空转等待.对于多核CPU而 ...
- 重新想象 Windows 8 Store Apps (48) - 多线程之其他辅助类: SpinWait, SpinLock, Volatile, SynchronizationContext, CoreDispatcher, ThreadLocal, ThreadStaticAttribute
[源码下载] 重新想象 Windows 8 Store Apps (48) - 多线程之其他辅助类: SpinWait, SpinLock, Volatile, SynchronizationCont ...
- 【linux】spinlock 的实现
一.什么是spinlock spinlock又称自旋锁,是实现保护共享资源而提出一种锁机制.自旋锁与互斥锁比较类似,都是为了解决对某项资源的互斥使用 无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一 ...
- atomic, spinlock and mutex性能比较
我非常好奇于不同同步原理的性能,于是对atomic, spinlock和mutex做了如下实验来比较: 1. 无同步的情况 #include <future> #include <i ...
随机推荐
- 虚拟机centos系统,停机装第二块网卡,需要更改的配置
虚拟机centos系统,停机装第二块网卡,需要更改的配置. 问题描述: 虚拟机centos系统,停机装第二块网卡,发现 /etc/sysconfig/network-scripts/ifcfg-et ...
- HDOJ1272(并查集,判断是否为树)
0 0 Yes 1 1 0 0 Yes 1 2 2 1 0 0 No //自回路不算一条边的! 居然有 0 0 这样的测试数据 #include<iostream> #include< ...
- javaIO 流分析总结
Java中的流,可以从不同的角度进行分类. 按照数据流的方向不同可以分为:输入流和输出流. 按照处理数据单位不同可以分为:字节流和字符流. 按照实现功能不同可以分为:节点流和处理流. 输出流: 输入流 ...
- sharepoint Foundation 2013安装过程
安装完必备软件后,便可安装sharepoint Foundation 2013
- 【机器学习】分类器组合——AdaBoost
AdaBoost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器). AdaBoost其实只是boost的一个特 ...
- CSS学习系列1 - CSS中的盒子模型 box model
css中有一个盒子模型的概念. 主要是用来告诉浏览器如何来计算页面元素的宽度和高度, 比如该元素的宽度/高度 是否包括内边距,边框,外边距. 盒子模型有一个属性box-sizing属性来说明是否包括 ...
- HTMLParser使用详解(2)- Node内容
HTMLParser使用详解(2)- Node内容 2010-03-18 13:41 HTMLParser将解析过的信息留存为一个树的结构.Node是信息留存的数据类型基础.请看Node的界说:pu ...
- Citrix 未注册解决办法
Citrix 经常出现未注册的问题 是因为DNS的解析 问题 ping DDC 的全名你会发现ping 不通 解决方案如下 首先 在 192.168.1.145(图站)上饭解析一下DDC(控制中心19 ...
- 部署到IIS上上传不了文件
应用程序池改一下
- 【关于安装mysql5.6的一些问题总结】
1:安装msyql5.6介质(mysql-5.6.24-winx64.msi)以后没有myslq服务: 解决: 管理员身份cmd进入bin目录: mysqld.exe -install Service ...