#include"RWLock.h"
#include<process.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
/**
使得对象具有读并发特性
*/
class RWTester
{
private:
int value; //需要并发的对象
RWLock rwl; //读写锁
public:
//封装其读写操作
int get(){
rwl.readLock(); //读锁
int t = value;
rwl.readUnLock(); //解读锁
return t;
}
void set(int v){
rwl.writeLock(); //写锁
value = v;
rwl.writeUnLock(); //解写锁
}
};
/*读者线程*/
unsigned int _stdcall readThreadFun(void *pv);
/*写者线程*/
unsigned int _stdcall writeThreadFun(void *pv);
int num; //全局测试变量
RWLock* rwl; //全局读写锁
unsigned int _stdcall writeTwoFun(void *pv); //写者线程,需要同时写两个变量
unsigned int _stdcall readFun(void *pv); //读者线程
int num1,num2; //全局测试变量
RWLock* rwl1,*rwl2; //全局读写锁
int main()
{
rwl = new RWLock(5); //最大允许同时5个读者
rwl1 = new RWLock();
rwl2 = new RWLock();
num = num1 = num2 = 10;
//简单读写测试
for(int i=0;i<10;i++){ //10个写者
HANDLE t = ( HANDLE )_beginthreadex( NULL , 0 , &writeThreadFun , NULL , 0 , 0 );
CloseHandle(t);
}
for(int j=0;j<100;j++){ //100个读者
HANDLE t = ( HANDLE )_beginthreadex( NULL , 0 , &readThreadFun , NULL , 0 , 0 );
CloseHandle(t);
}
//2个元素的读写测试
/*
for(int i=0;i<10;i++){ //10个写者
HANDLE t = ( HANDLE )_beginthreadex( NULL , 0 , &writeTwoFun , NULL , 0 , 0 );
CloseHandle(t);
}
for(int j=0;j<100;j++){ //100个读者
HANDLE t = ( HANDLE )_beginthreadex( NULL , 0 , &readFun , NULL , 0 , 0 );
CloseHandle(t);
}
*/
system("pause");
delete rwl;
delete rwl1;
delete rwl2;
return 0;
}
/**
读者线程
*/
unsigned int _stdcall readThreadFun(void *pv)
{
srand((unsigned)time(0)+GetCurrentThreadId()); //随机数种子
while(1){
Sleep(rand()%10000+10000);
if(rwl->tryRead()){ //尝试读
printf("线程%d 读出num为%d\n",GetCurrentThreadId(),num);
Sleep(10);
rwl->readUnLock(); //读了需要解锁
}
else
printf("线程%d 表示不能读\n",GetCurrentThreadId());
}
return 0;
}
/**
写者线程
*/
unsigned int _stdcall writeThreadFun(void *pv)
{
srand((unsigned)time(0)+GetCurrentThreadId()); //随机数种子
while(1){
Sleep(rand()%10000+15000);
if(rwl->tryWrite()){ //尝试写,不是写优先的
num = rand()%100;
printf("线程%d 写入num为%d\n",GetCurrentThreadId(),num);
Sleep(50);
rwl->writeUnLock();
}
else{
printf("线程%d 表示不能写,启用强制写\n",GetCurrentThreadId());
rwl->writeLock(); //加写锁,优先的
num = rand()%100;
printf("线程%d 强制写入num为%d\n",GetCurrentThreadId(),num);
Sleep(50);
rwl->writeUnLock();
}
}
return 0;
}
/*写者线程,同时写两个变量*/
unsigned int _stdcall writeTwoFun(void *pv)
{
srand((unsigned)time(0)+GetCurrentThreadId()); //随机数种子
while(1){
Sleep(rand()%10000+10000);
while(1){
if(rwl1->tryWrite()){ //尝试写
if(rwl2->tryWrite()){
num1 = rand()%100;
num2 = rand()%100;
printf("线程%d 写入num1为%d 写入num2为%d\n",GetCurrentThreadId(),num1,num2);
Sleep(50);
rwl2->writeUnLock();
rwl1->writeUnLock();
break;
}
else{
//不能写,为了避免死锁
printf("写不了等待下次吧\n");
rwl1->writeUnLock(); //放弃占有,等待下次
Sleep(100);
}
}
else{
printf("写不了等待下次吧\n");
Sleep(100);
}
}
}
return 0;
}
unsigned int _stdcall readFun(void *pv)
{
srand((unsigned)time(0)+GetCurrentThreadId()); //随机数种子
while(1){
Sleep(rand()%10000+10000);
if(rwl1->tryRead()){ //尝试读
if(rwl2->tryRead()){
printf("线程%d 读出num1为%d 读出num2为%d\n",GetCurrentThreadId(),num1,num2);
Sleep(10);
rwl2->readUnLock(); //读了需要解锁
rwl1->readUnLock(); //读了需要解锁
}
else{
printf("读不了等待下次吧\n");
rwl1->readUnLock();//放弃等待避免死锁
}
}
else{
printf("读不了等待下次吧\n");
}
}
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
前往页