[.net]基元线程同步构造
/* 基元线程同步构造
用户模式构造:
易变构造(Volatile Construct)
互锁构造(Interlocked Construct):自旋锁(Spinlock) 乐观锁(Optimistic Concurrency Control,乐观并发控制)
内核模式构造:
事件构造(Event)
信号量构造(Semaphore)
互斥体构造(Mutex)
*/ //易变构造,Volatile.Write()之前的所有字段写入操作,必须再该方法调用之前完成,Volatile.Read()之前的所有字段读取操作,必须再该方法之前完成,保证该方法作用的字段
//的赋值或读取顺序不被编译器优化,C#关键字volatile在语言层面提供了对易变构造的支持,标记为volatile的字段在按引用传递时无效。
public static class Volatile
{
public static void Write(ref Int32 location,Int32 value);
public static Int32 Read(ref Int32 location);
} //互锁构造
public static class Interlocked
{
public static Int32 Exchange(ref Int32 location,Int32 value); //Int32 old=location; if(location==comparand){ location=comparand;} return old;
public static Int32 CompareExchange(ref Int32 location,Int32 value,Int32 comparand);
} //简单自旋锁:自旋会浪费CPU时间,因此自旋锁只适用于执行的非常快的代码区域。在单CPU计算机上,希望获得锁的线程会不断的自旋,如果获得锁的线程优先级比较低的话,
//会导致自旋的线程抢占CPU时间,从而影响拥有锁的线程释放锁,比较容易形成“活锁”。
public struct SimpleSpinlock
{
private Int32 _inUse;//0:false,1:true,Interlocked不支持Boolean
public void Enter()
{
while (true)
{
if(Interlocked.Exchange(ref _inUse,)==)
return;
//一些其他代码
}
}
public void Leave()
{
Volatile.Write(ref _inUse,);
}
}
public class Demo
{
private SimpleSpinlock _spinLock;
public void Access()
{
_spinLock.Enter();
//取得锁,访问资源
_spinLock.Leave();
}
} //欢乐锁:用于完成一次原子性的操作,如果在执行过程中,数据被外部修改,那么当前执行的过程就无效,然后用修改后的值重新进行这次原子性的操作。
//说直白点就是乐观,与世无争。
public class OptimisticLoack
{
public delegate T Morpher<T, TArgument>(T startValue, TArgument argument);
public static T Morph<T, TArgument>(ref T target, TArgument value, Morpher<T,TArgument> morpher)where T:class
{
T currentValue = target, startValue, desiredValue;
do
{
startValue = currentValue;
desiredValue = morpher(startValue, value);
currentValue = Interlocked.CompareExchange(ref target, desiredValue, startValue);
} while (currentValue != startValue);
return desiredValue;
}
} //事件构造:自动重置事件 手动重置事件
public class EventWaitHandle:WaitHandle
{
public Boolean Set();
public Boolean Reset();
}
public class AutoResetEvent():EventWaitHandle
{
public AutoResetEvent(Boolean initialState);
}
public class ManualResetEvent():EventWaitHandle
{
public ManualResetEvent(Boolean initialState);
} //信号量构造
public class Semaphore:WaitHandle
{
public Semaphore(Int32 initialCount,Int32 maxinumCount);
public Int32 Release();
public Int32 Release(Int32 releaseCount);
} //互斥体构造,内部维护一个递归计数,可以实现递归锁
public sealed class Mutex:WaitHandle
{
public Mutex ();
public void ReleaseMutex();
} //事件构造,信号量构造,互斥体构造均可以简单的实现自旋锁
public class SimpleSpinlock
{
private readonly Mutex m_lock=new Mutex();//针对互斥体构造
//private readonly Semaphore m_lock=new Semaphore();//针对信号量构造
//private readonly AutoResetEvent m_lock=new AutoResetEvent(true);//针对事件构造
public void Enter()
{
m_lock.WaitOne();
}
public void Leave()
{
m_lock.ReleaseMutex();//针对互斥体构造
//m_lock.Release(1);//针对信号量构造
//m_lock.Set();//针对事件构造
}
}
[.net]基元线程同步构造的更多相关文章
- 基元线程同步构造之waithandle中 waitone使用
在使用基元线程同步构造中waithandle中waitone方法的讲解: 调用waithandle的waitone方法阻止当前线程(提前是其状态为Nonsignaled,即红灯),直到当前的 Wait ...
- 【C#进阶系列】28 基元线程同步构造
多个线程同时访问共享数据时,线程同步能防止数据损坏.之所以要强调同时,是因为线程同步问题实际上就是计时问题. 不需要线程同步是最理想的情况,因为线程同步一般很繁琐,涉及到线程同步锁的获取和释放,容易遗 ...
- Clr Via C#读书笔记----基元线程同步构造
线程文章:http://www.cnblogs.com/edisonchou/p/4848131.html 重点在于多个线程同时访问,保持线程的同步. 线程同步的问题: 1,线程同步比较繁琐,而且容易 ...
- 基元线程同步构造之 Mutes(互斥体)
互斥体实现了“互相排斥”(mutual exclusion)同步的简单形式(所以名为互斥体(mutex)). 互斥体禁止多个线程同时进入受保护的代码“临界区”(critical section). 因 ...
- 基元线程同步构造 AutoResetEvent和ManualResetEvent 线程同步
在.Net多线程编程中,AutoResetEvent和ManualResetEvent这两个类经常用到, 他们的用法很类似,但也有区别.ManualResetEvent和AutoResetEvent都 ...
- CLR via C# I/O基元线程同步构造
1. 分为用户模式构造和内核模式构造 2. 用户模式构造 a.易失构造 在一个简单数据类型的变量上执行原子性读或写操作 VolaileWrite 强制address中的值在调用时写入,除此之外,按照源 ...
- 基元线程同步构造之信号量(Semaphore)
信号量(semaphore)不过是由内核维护的 int32变量而已,(说通俗点就是好比一个线程容器里面允许执行的线程数,0计数就是允许执行的0个线程数,1就是允许执行的1个线程数,2就是允许执行的2个 ...
- 【C#进阶系列】29 混合线程同步构造
上一章讲了基元线程同步构造,而其它的线程同步构造都是基于这些基元线程同步构造的,并且一般都合并了用户模式和内核模式构造,我们称之为混合线程同步构造. 在没有线程竞争时,混合线程提供了基于用户模式构造所 ...
- 【C#】C#线程_基元线程的同步构造
目录结构: contents structure [+] 简介 为什么需要使用线程同步 线程同步的缺点 基元线程同步 什么是基元线程 基元用户模式构造和内核模式构造的比较 用户模式构造 易变构造(Vo ...
随机推荐
- .net VS2008 时间加减,时间段,时间格式化到秒
举个例子: DateTime time1 = DateTime.Now; DateTime time2 = time1.AddDays(1); time1是当前时间,time2比当前时间多一天.也就是 ...
- 《Google软件测试之道》摘录
以下是最近看的一本书<Google软件测试之道>里的一些摘录,收获很多. 1.讨论测试开发比并没有什么意义,如果你是一名开发人员,同时也是一名测试人员,如果你的职位头衔上有测试的字样,你的 ...
- Tomcat设置默认时区
本文讲解如何在tomcat启动时设置JVM默认时区. 环境:JDK1.8.114 web容器:Tomcat 9 tomcat启动脚本 /etc/init.d/tomcat 操作系统ubuntu 16 ...
- Golang之Mysql事务
Mysql事务 )原子性 )一致性 )隔离性 )持久性 示例代码 package main import ( "fmt" _ "github.com/go-sql-dri ...
- zabbix分布式系统监视
http://blog.chinaunix.net/uid-25266990-id-3380929.html
- composer install 时,提示:Package yiisoft/yii2-codeception is abandoned, you should avoid using it. Use codeception/codeception instead.的解决
由 SHUIJINGWAN · 2017/11/24 1.composer install 时,提示:Package yiisoft/yii2-codeception is abandoned, yo ...
- Find one unique integer
https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Moc ...
- changetoutf-8
import chardet import os # ANSI文件转UTF-8 import codecs import os def strJudgeCode(str): return charde ...
- 201521123035-个人作业4——alpha阶段个人总结
个人总结 在alpha 结束之后, 每位同学写一篇个人博客, 总结自己的alpha 过程: 第一部分 类别 具体技能和面试问题 现在的回答(大三) 语言 最拿手的计算机语言是一?,代码量多少?(偏前端 ...
- Win7_Ultimate + VS2010 + openGL 配置
Win7_Ultimate + VS2010 + openGL 配置 0. 前言 OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性. (1)与C语言紧密结合. O ...