刘收获

导航

读写锁 SRWLOCK

       读写锁在对资源进行保护的同时,还能区分想要读取资源值的线程(读取者线程)和想要更新资源的线程(写入者线程)。

       对于读取者线程,读写锁会允许他们并发的执行。当有写入者线程在占有资源时,读写锁会让其它写入者线程和读取者线程等待

       用读写锁来解决读者写者问题会使代码非常清晰和简洁。

 

  

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.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>  
#include <windows.h>  
#include <process.h>  

using namespace std;
unsigned int __stdcall ReadThread(PVOID ParameterData);
unsigned int __stdcall WriteThread(PVOID ParameterData);

const int NUM = 30, READER_SIZE = 10;
HANDLE ThreadRead[NUM],  ThreadWrite[NUM];
SRWLOCK __SRWLock;

int main() 
{
	InitializeSRWLock(&__SRWLock);

	int i = 0;
	for (; i<NUM; i++) {
		ThreadRead[i] = (HANDLE)_beginthreadex(NULL, 0, ReadThread, NULL, 0, NULL);
		ThreadWrite[i] = (HANDLE)_beginthreadex(NULL, 0, WriteThread, NULL, 0, NULL);
	}

	WaitForMultipleObjects(NUM, ThreadRead, TRUE, INFINITE);
	WaitForMultipleObjects(NUM, ThreadWrite, TRUE, INFINITE);

	cout << "运行完毕" << endl;
	getchar();
	return 0;
}

unsigned int __stdcall ReadThread(PVOID ParameterData) {
	AcquireSRWLockShared(&__SRWLock);

	cout << "ID" << GetCurrentThreadId() << "   Read Thread Begin!" << endl;
	Sleep(100);
	cout << "ID" << GetCurrentThreadId() << "   Read Thread Terminate!" << endl;

	ReleaseSRWLockShared(&__SRWLock);
	return 0;
}

unsigned int __stdcall WriteThread(PVOID ParameterData) {
	AcquireSRWLockExclusive(&__SRWLock);
	cout << "ID" << GetCurrentThreadId() << "       WRITE Thread Begin~~~~~~~~~~" << endl;
	Sleep(200);
	cout << "ID" << GetCurrentThreadId() << "	    WRITE Thread Terminate~~~~~~" << endl;
	ReleaseSRWLockExclusive(&__SRWLock);
	return 0;
}

  

posted on 2017-08-16 21:39  沉疴  阅读(433)  评论(0编辑  收藏  举报