Windows Via C/C++:用户模式下的线程同步——轻量级读写锁(Slim Reader-Writer Locks)
2009-11-08 20:25
393 查看
注意,本节讨论的Slim Reader-Writer Locks和下一节讨论的条件变量(Condition Variable)是微软从Vista开始才提供的新同步对象
和临界区的作用类似,轻量级读写锁(Slim Reader-Write Lock,以下简称SRWLock)用来同步多线程对共享资源的访问,与临界区不同的是,SRWLock能够区分读取共享资源的线程(读者)和修改共享资源的线程(修改者)。SRWLock允许多个读者并发的读取被保护的资源,因为读取操作并不会引发数据破坏,但在修改者修改资源时,SRWLock不允许其它读者线程和修改者线程访问该资源。
使用SRWLock时,首先创建SRWLOCK类型的变量,并用InitializeSRWLock初始化:
SRWLOCK结构在WinBase.h中被声明为RTL_SRWLOCK,后者在WinNT.h中定义,其成员只有一个PVOID类型的指针。Platform SDK文档中并没有该结构的描述,因此不要尝试编写依赖于SRWLOCK结构细节的代码。
SRWLock初始化后,修改者线程就可以调用AcquireSRWLockExclusive尝试获得对被保护资源的排它性访问了:
修改者线程完成其访问后,应该调用ReleaseSRWLockExclusive释放锁:
读者线程访问共享资源时,也要经过同样的步骤,其使用的函数如下:
没有删除SRWLock的函数,因为当不再需要使用SRWLock时,系统会自动销毁它。
虽然临界区和SRWLock非常相似,但临界区的某些特性是SRWLock不具备的:
没有TryEnter(Shared/Exclusive)SRWLock函数,AcquireSRWLock(Shared/Exclusive)在请求的锁不可用时会阻塞
SRWLock是不可重入的,但临界区可以
除了上述两点,SRWLock在效率上要优于临界区。
和临界区的作用类似,轻量级读写锁(Slim Reader-Write Lock,以下简称SRWLock)用来同步多线程对共享资源的访问,与临界区不同的是,SRWLock能够区分读取共享资源的线程(读者)和修改共享资源的线程(修改者)。SRWLock允许多个读者并发的读取被保护的资源,因为读取操作并不会引发数据破坏,但在修改者修改资源时,SRWLock不允许其它读者线程和修改者线程访问该资源。
使用SRWLock时,首先创建SRWLOCK类型的变量,并用InitializeSRWLock初始化:
VOID InitializeSRWLock(PSRWLOCK SRWLock);
SRWLOCK结构在WinBase.h中被声明为RTL_SRWLOCK,后者在WinNT.h中定义,其成员只有一个PVOID类型的指针。Platform SDK文档中并没有该结构的描述,因此不要尝试编写依赖于SRWLOCK结构细节的代码。
typedef struct _RTL_SRWLOCK { PVOID Ptr; } RTL_SRWLOCK, *PRTL_SRWLOCK;
SRWLock初始化后,修改者线程就可以调用AcquireSRWLockExclusive尝试获得对被保护资源的排它性访问了:
VOID AcquireSRWLockExclusive(PSRWLOCK SRWLock);
修改者线程完成其访问后,应该调用ReleaseSRWLockExclusive释放锁:
VOID ReleaseSRWLockExclusive(PSRWLOCK SRWLock);
读者线程访问共享资源时,也要经过同样的步骤,其使用的函数如下:
VOID AcquireSRWLockShared(PSRWLOCK SRWLock); VOID ReleaseSRWLockShared(PSRWLOCK SRWLock);
没有删除SRWLock的函数,因为当不再需要使用SRWLock时,系统会自动销毁它。
虽然临界区和SRWLock非常相似,但临界区的某些特性是SRWLock不具备的:
没有TryEnter(Shared/Exclusive)SRWLock函数,AcquireSRWLock(Shared/Exclusive)在请求的锁不可用时会阻塞
SRWLock是不可重入的,但临界区可以
除了上述两点,SRWLock在效率上要优于临界区。
相关文章推荐
- Windows via C/C++ 学习(16)用户模式下的线程同步(一)
- Windows Via C/C++:用户模式下的线程同步——临界区 Critical Sections
- Windows Via C/C++:用户模式下的线程同步——Condition Variables 条件变量
- Windows Via C/C++:用户模式下的线程同步——原子操作:Interlocked函数族
- Windows Via C/C++:用户模式下的线程同步——概述
- Windows Via C/C++:用户模式下的线程同步——原子操作:Interlocked函数族
- Windows Via C/C++:用户模式下的线程同步——Cache行
- 《Windows via C/C++》学习笔记 —— 用户模式的“线程同步”之“读写锁”
- Windows Via C/C++ 读书笔记 5 用户模式的线程同步
- 《Windows via C/C++》学习笔记 —— 用户模式的“线程同步”之“条件变量”
- 《Windows via C/C++》学习笔记(四)用户模式的“线程同步”
- 《Windows via C/C++》学习笔记 —— 用户模式的“线程同步”之“互锁函数族”
- 《Windows via C/C++》学习笔记 —— 用户模式的“线程同步”之“关键代码段”
- Windows Via C/C++:内核模式下的用户同步——成功等待的副作用
- Windows Via C/C++:内核模式下的线程同步——概述
- Windows Via C/C++:内核模式下的线程同步——事件内核对象
- Windows Via C/C++:内核模式下的线程同步——WaitForSingleObject/WaitForMultipleObjects函数
- 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock
- 《Windows via C/C++》学习笔记 —— “线程同步”之“检测死锁”
- 《windows via C++》之windows线程同步