您的位置:首页 > 其它

线程同步 Slim读写锁 SRWLOCK 用户模式同步对象 InitializeSRWLock

2015-11-10 15:01 429 查看

0、思考

如果写线程被阻塞期间不断的有读线程请求共享式访问共享资源,到底该不该予以访问权限呢?


1、相关api

SRWLOCK
InitializeSRWLock
AcquireSRWLockExclusive
AcquireSRWLockShared
ReleaseSRWLockExclusive
ReleaseSRWLockShared


2、写在前面

独占式访问:写线程访问共享资源的方式;
共享式访问:读线程访问共享资源的方式;
当有读线程访问资源时,写线程等待访问时,新的读线程因为有写线程等待所以不允许访问。(保证读写的公平)


3、api说明

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
);


4、C++封装

#pragma once

#include <windows.h>

class ncSRWLock
{
public:
ncSRWLock()
{
InitializeSRWLock(_srwLock);
}

~ncSRWLock()
{
}

public:
void lock (bool isExclusive = true)
{
if (isExclusive) {
AcquireSRWLockExclusive (_srwLock);
}
else {
AcquireSRWLockShared (_srwLock);
}
}

void unlock (bool isExclusive = true)
{
if (isExclusive) {
ReleaseSRWLockExclusive (_srwLock);
}
else {
ReleaseSRWLockShared (_srwLock);
}
}

private:
SRWLOCK _srwLock;
};


5、顺藤摸瓜

鸣谢

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: