readers and writers problem 读者写者问题 写者优先 C++实现

参考http://en.wikipedia.org/wiki/Readers-writers_problem

第二类读者写者问题,写优先

#include <cstdio>
#include <Windows.h>
#include <ctime>
int readcount, writecount;
HANDLE mutex_1; // 限制readcount
HANDLE mutex_2; // 限制writecount
HANDLE mutex_3; // 限制r
HANDLE r; // 有没有reader
HANDLE w; // 有没有writer
/*能够并发地读,不能并发地写,写的时候不能读,写优先*/

DWORD WINAPI reader_thread(void *param);
DWORD WINAPI writer_thread(void *param);

DWORD WINAPI reader_thread(void * param)
{
	int my_id = *(int *)param;
	printf("%dth reader come\n", my_id);
	WaitForSingleObject(mutex_3, INFINITE);
	WaitForSingleObject(r,INFINITE);
	WaitForSingleObject(mutex_1, INFINITE);
	readcount += 1;
	if(readcount == 1) 
		WaitForSingleObject(w, INFINITE);//只要有reader已经在read,就不让一个write去写
	ReleaseMutex(mutex_1);
	ReleaseMutex(r);
	ReleaseMutex(mutex_3);

	/*reading*/
	printf("%dth reader is doing reading\n", my_id);
	Sleep(2000);
	printf("%dth reader finish reading\n", my_id);

	WaitForSingleObject(mutex_1, INFINITE);
	readcount -= 1;
	if (readcount == 0) 
		ReleaseMutex(w);
	ReleaseMutex(mutex_1);
	return 1;
}
DWORD WINAPI writer_thread(void *param)
{
	int my_id = *(int *)param;
	printf("%dth writer come\n", my_id);
	WaitForSingleObject(mutex_2, INFINITE);
	writecount += 1;
	if(writecount == 1) 
		WaitForSingleObject(r, INFINITE);//只要有writer存在,就reader在后面等待
	ReleaseMutex(mutex_2);

	WaitForSingleObject(w, INFINITE);
	printf("%dth writer is writing\n", my_id);
	Sleep(2000);
	printf("%dth writer finish writing\n", my_id);

	WaitForSingleObject(mutex_2, INFINITE);
	writecount -= 1;
	if(writecount == 0)
		ReleaseMutex(r);
	ReleaseMutex(mutex_2);
	return 1;
}
#define NUM 100000
int reader_id,writer_id;
int temp_r[NUM], temp_w[NUM];
void gen()
{
	HANDLE h;
	if(rand()%2==0) // 产生reader
	{
		reader_id++;
		temp_r[reader_id] = reader_id;
		h = CreateThread(NULL, 0, reader_thread, (void *)(&temp_r[reader_id]), 0, NULL);
	}
	else // 产生writer
	{
		writer_id++;
		temp_w[writer_id] = writer_id;
		h = CreateThread(NULL, 0, writer_thread, (void *)(&temp_w[writer_id]), 0, NULL);
	}
}
int main ()
{
	mutex_1 = CreateMutex(NULL, FALSE, L"mutex_1");
	mutex_2 = CreateMutex(NULL, FALSE, L"mutex_2");
	mutex_3 = CreateMutex(NULL, FALSE, L"mutex_3");
	r = CreateMutex(NULL, FALSE, L"r");
	w = CreateMutex(NULL, FALSE, L"w");

	srand(time(NULL));
	while(reader_id<NUM && writer_id<NUM)
	{
		if(rand()%2 == 0)
		{
			gen();
		}
		if(rand()%3 == 0)
		{
			gen();
		}
		if(rand()%3 == 0)
		{
			gen();
		}
		Sleep(3000);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值