线程通信机制之轻量级读写锁
来源:互联网 发布:matlab 创建cell数组 编辑:程序博客网 时间:2024/06/13 14:27
关键词:读写锁,线程同步,ITC
Slim Reader/Writer (SRW) Locks(轻量级读写锁,笔者译)跟critical section类似,用于控制同一个进程内部不同线程之间共享资源的访问,设计的最初目的是高效性,并且占用很少内存。读线程从共享资源中读数据,同时写线程需要向共享资源中写数据,当多个读、写线程共用一个资源(缓冲区)的时候,据需要使用诸如critical section或者互斥量的排他性锁(独占锁)来控制资源的访问,但是针对读操作较为频繁,写操作相对较少的情况下,使用独占锁是很不划算的,需要耗费更多的时间和其他资源。这种情况下使用轻量级读写锁是非常合适的。SRW锁提供两种访问共享资源的方式:
(1)共享模型:多个读线程共享资源的只读访问权,这样就可以让读线程可以并发地读取共享资源中的数据。通常情况下,如果读操作超过写操作,相对于使用critical section,SRW锁提供的并发性对系统性能和吞吐率有很大提升。
(2)排他模式(独占模式):写线程独立获得共享资源的读/写权限。如果某个线程获得了独占锁,其他线程是不能访问共享资源的,直到该线程释放独占锁。
SRW锁可以使用上面两种模式中任意一种模式获得,通常读线程使用共享模式获得SRW锁,写线程通常使用独占模式获得SRW锁。Windows操作系统下对于请求线程获得SRW锁的顺序是不确定的,SRW锁的获得概率不是平均的,也不是按照先到先得(FIFO)的方式。
SRW锁在具体实现上的较为简单,Windows下是一个指针的长度,这样能够快速更新锁的状态。带来的问题是附带的状态信息非常少,也使得SRW锁不能递归的获得,即SRW锁在获得之后,不能再调用捕获同一个锁的函数,同时对于获得共享模式下的SRW锁的线程不能动态的将权限提升到独占锁,要实现这种操作必须先释放共享锁,然后重新等待获得独占锁。
表格 1 SRW锁相关函数及其说明
SRW lock function
Description
AcquireSRWLockExclusive
以独占模式获得 SRW lock
AcquireSRWLockShared
以共享模式获得SRW lock
InitializeSRWLock
初始化 SRW lock.
ReleaseSRWLockExclusive
释放独占模式下打开的SRW lock
ReleaseSRWLockShared
释放共享模式下打开的SRW lock
SleepConditionVariableSRW
以原子操作执行两个操作:等待条件变量成立并已获得的释放SRW锁.
TryAcquireSRWLockExclusive
以独占模式尝试获得SRW lock。如果函数调用成功,调用线程获得该锁。
TryAcquireSRWLockShared
以共享模式尝试获得SRW lock。函数调用成功的话,调用线程获得该锁。
轻量级读写锁使用时首先要初始化SRW锁,然后成对的使用acquire和release函数来控制临界资源的访问。(需要说明的是最后两个函数是Win 7上新提供的函数,所以不要在低版本的操作系统上使用这两个函数)。可使用tryacquireXXX函数来提前测试线程时候可以获得SRW锁,如果不可以,继续执行其他操作既可以。提高系统的运行效率和CPU利用率。
转自:http://www.cnblogs.com/tocy/archive/2012/06/03/2532560.html
- 线程通信机制之轻量级读写锁
- Linux线程编程 - 线程同步机制之读写锁通信机制
- 线程通信----读写锁
- <linux线程>同步互斥机制之【读写锁】
- 轻量级 读写锁(SRW)
- 线程通信机制之定时器队列
- 线程间通信之等待唤醒机制
- 线程间通信之等待唤醒机制
- 进程通信之读写锁
- 线程间同步机制----读写锁
- JAVA线程读写锁与线程之间通信例子
- 线程学习之读写锁
- 线程编程之读写锁
- 线程使用之读写锁
- 线程同步之读写锁
- Linux程序设计学习笔记----多线程编程线程同步机制之互斥量(锁)与读写锁
- Java线程通信机制
- Handler线程通信机制。
- 【hdu】 敌兵布阵 (线段树)
- Android基础类之BaseAdapter
- BLCR调查记录
- SAP HANA 索引类型(SAP HANA index types)
- Linux下配置安装NFS
- 线程通信机制之轻量级读写锁
- 消除Key Lookup和RID Lookup Part2:索引交集和索引Join
- 在PowerDesigner中设计物理模型1——表和主外键
- 菜鸟列举小例浅谈数据库之------视图
- DATEPART (Transact-SQL)
- exec() and system() in PHP
- IBM i系统对象和DB2数据库对象的对应关系
- 基于Hibernate的主键生成策略
- ffmpeg中的sws_scale算法性能测试