注意,本节讨论的Slim Reader-Writer Locks和下一节讨论的条件变量(Condition Variable)是微软从Vista开始才提供的新同步对象
和临界区的作用类似,轻量级读写锁(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不具备的:
除了上述两点,SRWLock在效率上要优于临界区。