clr via c# 3rd 阅读摘要 -凯发k8官方网
凯发k8官方网
收集整理的这篇文章主要介绍了
clr via c# 3rd 阅读摘要 -- chapter 28 – primitive thread synchronization constructs
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
- 1.极其乏味易错;
- 2.锁严重影响性能;
- 3.线程同步锁在同一时间点仅允许一个线程访问资源。
一个例外:如果实例方法是用于协调多线程的,那么该实例方法也应该多线程安全。如cancellationtokensource.cancel方法。
- 用户模式:速度很快,使用特定的cpu指令协调线程,协调工作由硬件完成。windows系统不会检测线程是否阻塞在用户模式同步结构;
线程池线程阻塞在用户模式同步结构不会被当成阻塞,线程池不会创建新的线程来代替临时阻塞的线程。
采用该模式的线程会被系统抢占调度,可能导致线程被反复快速调度,从而会浪费cpu; - 核心模式:windows操作系统提供,调用实现在系统内核的函数。当一个线程使用内核模式同步结构来请求其他线程持有的资源,windows将阻塞该线程所以不会浪费cpu;
线程在用户模式与核心模式间互相转换会严重损害性能; - 如果一个线程持有一个同步结构不再释放它,等待该结构的线程将永远被阻塞:
- 活锁:如果该同步结构是用户模式,线程一直运行在cpu上;
- 死锁:如果该同步结构是核心模式,线程被阻塞住;
- 活锁与死锁都很糟糕,但相比之下,活锁更糟糕,因为活锁既浪费cpu又浪费内存,而死锁只浪费内存;
- 易变(volatile)结构:在一个简单数据类型变量上执行原子读或写操作;
- 联锁(interlocked)结构:在一个简单数据类型变量上执行原子读和写操作;
- 当核心模式同步结构检测到资源上出现竞争时,windows阻塞竞争失败的线程,因此不再浪费处理器资源;
- 核心模式同步结构可以同步本地线程和托管线程;
- 核心模式同步结构可以同步运行在同一台机器上不同处理器上的线程;
- 核心模式同步结构可以附上安全限制避免未经认证的帐号访问他们;
- 线程能够被阻塞直到所有的核心模式同步结构都可用,或者任何一个可用;
- 阻塞在核心模式同步结构上的线程可以设置一个timeout值;如果这段时间内没能获得期望的资源,那么不再阻塞以干点其他正事。
- 事件(events):事件是有内核管理的boolean变量。当事件为false时,线程被阻塞。有两种事件:autoresetevent、manualresetevent;
- 信号量(semaphore):信号量是内核管理的int32变量。当信号量为0时,线程被阻塞;>0时,线程不被阻塞。
当锁上没有竞争时,simplewaitlock比simplespinlock要慢许多,因为simplewaitlock的enter和leave方法会强制调用线程在托管代码到核心代码之间进行来回转换;
但是当锁上有竞争时,simplewaitlock不会浪费cpu资源,而simplespinlock会不停的轮转cpu;
- 当多个线程在autoresetevent上等待时,设置事件只会让一个线程不再被阻塞;
- 当多个线程在manualresetevent上等待时,设置事件会让所有线程不再被阻塞;
- 当多个线程在semaphore上等待时,释放信号量会让releasecount个线程不再被阻塞(relasecount是semaphore.release()方法的参数)。
- 首先,mutex对象通过查询调用线程的id记录了哪个线程获得了它。当线程调用releasemutex,mutex会确认是否为同一线程;
- 其次,mutex维护一个递归计数指出被获得了多少次。只有当递归计数降为0时,其他线程才能获取。
本章讲述了原生的线程同步结构,首先介绍了类库和线程安全性概念,然后对线程同步模式进行了分类:用户模式与核心模式,接着详细说明了这两种同步模式的实现细节,并举例进行了对比。
转载于:https://www.cnblogs.com/bengxia/archive/2010/07/01/1768923.html
总结
以上是凯发k8官方网为你收集整理的clr via c# 3rd 阅读摘要 -- chapter 28 – primitive thread synchronization constructs的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: ms sql server表自增字段重置
- 下一篇: