您的位置:首页 > 编程语言 > C语言/C++

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初始化:

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在效率上要优于临界区。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐