SRWLock
读写锁在对资源进行保护的同时,还能区分想要读取资源值的线程(读取者线程)和想要更新资源的线程(写入者线程):
对于读取者线程,读写锁会允许他们并发的执行。
当有写入者线程在占有资源时,读写锁会让其它写入者线程和读取者线程等待。
对于一个读写锁,有两种获取方式:共享(Shared)或独占(Exclusive)。
如果当前读写锁处于空闲状态,那么当多个线程同时以共享方式访问该读写锁时,都可以成功;
而此时如果一个线程以独占的方式访问该读写锁,那么它会等待所有共享访问都结束后才可以成功。在读写锁被独占访问的过程中,再次共享和独占请求访问该锁,都会进行等待状态。
相关函数
//微软定义
typedef RTL_SRWLOCK SRWLOCK, *PSRWLOCK;
typedef struct _RTL_SRWLOCK {
PVOID Ptr;
} RTL_SRWLOCK, *PRTL_SRWLOCK;
// 初始化读写锁
WINBASEAPI
VOID
WINAPI
InitializeSRWLock(
__out PSRWLOCK SRWLock
);
// 独占式访问
WINBASEAPI
VOID
WINAPI
AcquireSRWLockExclusive(
__inout PSRWLOCK SRWLock
);
// 共享式访问
WINBASEAPI
VOID
WINAPI
AcquireSRWLockShared(
__inout PSRWLOCK SRWLock
);
// 独占式释放
WINBASEAPI
VOID
WINAPI
ReleaseSRWLockExclusive(
__inout PSRWLOCK SRWLock
);
// 共享式释放
WINBASEAPI
VOID
WINAPI
ReleaseSRWLockShared(
__inout PSRWLOCK SRWLock
);
代码举例
// SRWLock-ThreadSynchron