使用sdl接口实现的读写锁, 参考了windows下读写锁的实现
见: http://blog.csdn.net/chenjiayi_yun/article/details/8780800
【需要sdl开发包, 头文件和库文件】
ReadWriteLock.h代码
#ifndef _READ_WRITE_LOCK_H_
#define _READ_WRITE_LOCK_H_
#include "SDL_mutex.h"
typedef struct _RWLock
{
SDL_mutex* hMutex;
SDL_sem* hDataLock;
int nReaderCount;
}RWLock;
class CRWLock
{
public:
CRWLock();
~CRWLock();
bool AcquireReadLock();
bool ReleaseReadLock();
bool AcquireWriteLock();
bool ReleaseWriteLock();
private:
bool InitRWLock();
bool DestroyRWLock();
RWLock m_RWLock;
};
#endif
ReadWriteLock.cpp
#include "ReadWriteLock.h"
CRWLock::CRWLock()
{
InitRWLock();
}
CRWLock::~CRWLock()
{
DestroyRWLock();
}
bool CRWLock::InitRWLock()
{
m_RWLock.nReaderCount = 0;
m_RWLock.hDataLock = SDL_CreateSemaphore(1);
if (NULL == m_RWLock.hDataLock)
{
return false;
}
m_RWLock.hMutex = SDL_CreateMutex();
if (NULL == m_RWLock.hMutex){
SDL_DestroySemaphore(m_RWLock.hDataLock);
return false;
}
return true;
}
bool CRWLock::DestroyRWLock()
{
if (NULL != m_RWLock.hMutex){
SDL_DestroyMutex(m_RWLock.hMutex);
}
if (NULL != m_RWLock.hDataLock){
SDL_DestroySemaphore(m_RWLock.hDataLock);
}
return true;
}
bool CRWLock::AcquireReadLock()
{
bool result = true;
if (0 != SDL_LockMutex(m_RWLock.hMutex)){
return false;
}
m_RWLock.nReaderCount++;
if (1 == m_RWLock.nReaderCount)
{
if(0 != SDL_SemWait(m_RWLock.hDataLock)){
result = false;
}
}
SDL_UnlockMutex(m_RWLock.hMutex);
return result;
}
bool CRWLock::ReleaseReadLock(){
bool result = true;
if (0 != SDL_LockMutex(m_RWLock.hMutex)){
return false;
}
--m_RWLock.nReaderCount;
if (m_RWLock.nReaderCount == 0){
if(0 != SDL_SemPost(m_RWLock.hDataLock)){
result = false;
}
}
if (0 != SDL_UnlockMutex(m_RWLock.hMutex)){
return false;
}
return result;
}
bool CRWLock::AcquireWriteLock(){
if(0 == SDL_SemWait(m_RWLock.hDataLock)){
return true;
}
return false;
}
bool CRWLock::ReleaseWriteLock(){
if (0 != SDL_SemPost(m_RWLock.hDataLock)){
return false;
}
return true;
}
测试代码:
#include "windows.h"
#include "ReadWriteLock.h"
#include "SDL_thread.h"
bool stopTesting = false;
int reader = 0, writer = 0;
int readProcess1(void* data){
CRWLock* r1 = (CRWLock*)data;
while (!stopTesting){
r1->AcquireReadLock();
printf("r1: 读\n");
Sleep(10);
r1->ReleaseReadLock();
printf("r1: stop\n");
Sleep(20);
}
return 0;
}
int readProcess2(void* data){
CRWLock* r2 = (CRWLock*)data;
while (!stopTesting){
r2->AcquireReadLock();
printf("r2: 读\n");
Sleep(10);
r2->ReleaseReadLock();
printf("r2: stop\n");
}
return 0;
}
int readProcess3(void* data){
CRWLock* r3 = (CRWLock*)data;
while (!stopTesting){
r3->AcquireReadLock();
printf("r3: 读\n");
Sleep(20);
r3->ReleaseReadLock();
printf("r3: stop\n");
Sleep(20);
}
return 0;
}
int writeProcess1(void* data){
CRWLock* w1 = (CRWLock*)data;
while (!stopTesting){
w1->AcquireWriteLock();
printf("w1: 写\n");
Sleep(50);
w1->ReleaseWriteLock();
printf("w1: stop\n");
Sleep(10);
}
return 0;
}
int writeProcess2(void* data){
CRWLock* w2 = (CRWLock*)data;
while (!stopTesting){
w2->AcquireWriteLock();
printf("w2: 写\n");
Sleep(50);
w2->ReleaseWriteLock();
printf("w2: stop\n");
Sleep(10);
}
return 0;
}
int main(int argc, _TCHAR* argv[])
{
CRWLock rwLock;
SDL_Thread* r1 = SDL_CreateThread(readProcess1, "readThread1", &rwLock);
SDL_Thread* r2 = SDL_CreateThread(readProcess2, "readThread2", &rwLock);
SDL_Thread* r3 = SDL_CreateThread(readProcess3, "readThread3", &rwLock);
SDL_Thread* w1 = SDL_CreateThread(writeProcess1, "writeThread1", &rwLock);
SDL_Thread* w2 = SDL_CreateThread(writeProcess2, "writeThread2", &rwLock);
Sleep(1000);
stopTesting = true;
SDL_WaitThread(r1, NULL);
printf("读线程1结束\n");
SDL_WaitThread(r2, NULL);
printf("读线程2结束\n");
SDL_WaitThread(r3, NULL);
SDL_WaitThread(w1, NULL);
printf("写线程1结束\n");
SDL_WaitThread(w2, NULL);
printf("写线程2结束\n");
return 0;
}