您的位置:首页 > 其它

线程同步——用户模式下线程同步——Slim读写锁实现线程同步

2014-08-16 11:01 316 查看
//Slim读/写锁实现线程同步
SRWlock 的目的和关键段相同:对同一资源进行保护,不让其它线程访问。
但是,与关键段不同的是,SRWlock允许我们区分哪些想要读取资源的线程(读取者线程)
和哪些想要更新资源值的线程(写入者线程)。让所有读取者资源在同一时刻访问共享资源应该是
可行的,这是因为仅仅读取资源并不存在破坏数据的风险。只有当写入者线程想要对资源进行更新时才需要同步。
这种情况下,写入者线程应该独占资源访问权:任何线程,无论是读取还是写入者线程,都不许访问资源。
这就是SRWlock强大之处。

//使用步骤:
//(1)必须先定义 CRITICAL_SECTION 结构
SRWLOCK g_cs;
//(2)初始化关键段 SRWLOCK
InitializeSRWLock(&g_cs);
//3)写入者线程
DWORD WINAPI ThreadFunOne(PVOID pvParam)
{
AcquireSRWLockExclusive(&g_cs)  ;

//写入资源  应该放在AcquireSRWLockExclusive和ReleaseSRWLockExclusive函数之间
g_x ++ ;

ReleaseSRWLockExclusive(&g_cs);
return 0;
}
//4)读取者线程
DWORD WINAPI ThreadFunTwo(PVOID pvParam)
{
AcquireSRWLockShared(&g_cs)  ;

//读取资  源应该放在AcquireSRWLockShared和ReleaseSRWLockShared函数之间
cout<<"ThreadFunTwo:"<<g_x<<endl  ;

ReleaseSRWLockShared(&g_cs);
return 0;
}

不存在用来删除或者销毁 SRWLOCK 的函数,因为系统会自动执行清理工作

与关键段相比,SRWlock 缺乏两个特性。
1)不存在TryEnter(Shared/Exclusive)SRWLock之类的函数:如果锁已经被占用,
那么调用AcquireSRWLock(Shared/Exclusive)会阻塞调用线程。
2)不能递归的获得 SRWLOCK 也就是说一个线程不能多次写入资源而多次锁定资源,
然后多次调用ReleaseSRWLock*来释放资源锁定。

#include "windows.h"
#include "iostream"
using namespace std;
long g_x = 0 ;
//(1)必须先定义 CRITICAL_SECTION 结构
SRWLOCK g_cs;

//定义线程函数1
DWORD WINAPI ThreadFunOne(PVOID pvParam) ;

//定义线程函数2
DWORD WINAPI ThreadFunTwo(PVOID pvParam);

int main()
{

//(2)初始化关键段 SRWLOCK
InitializeSRWLock(&g_cs);

//创建线程1
HANDLE hThreadOne = CreateThread(NULL,0,ThreadFunOne,0,0,NULL);
CloseHandle(hThreadOne);

//创建线程2
HANDLE hThreadTwo = CreateThread(NULL,0,ThreadFunTwo,0,0,NULL);
CloseHandle(hThreadTwo);

//让主线程先挂起,确保其它线程执行完成
Sleep(1000);
cout<<g_x<<endl;

//(4)清理CRITICAL_SECTION结构,必须确保已经没有资源使用此关键段,否则会出现不可预料的结果

return 0 ;
}

DWORD WINAPI ThreadFunOne(PVOID pvParam)
{
AcquireSRWLockExclusive(&g_cs)  ;

//写入资源  应该放在AcquireSRWLockExclusive和ReleaseSRWLockExclusive函数之间
g_x ++ ;

ReleaseSRWLockExclusive(&g_cs);
return 0;
}

DWORD WINAPI ThreadFunTwo(PVOID pvParam)
{
AcquireSRWLockShared(&g_cs)  ;

//读取资  源应该放在AcquireSRWLockShared和ReleaseSRWLockShared函数之间
cout<<"ThreadFunTwo:"<<g_x<<endl  ;

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