使用sdl接口实现的读写锁,非写优先

使用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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值