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

来源:互联网 发布:软件开发工程师认证 编辑:程序博客网 时间:2024/05/16 16:24

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

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

#include <cstdio>#include <Windows.h>#include <ctime>int readcount, writecount;HANDLE mutex_1; // 限制readcountHANDLE mutex_2; // 限制writecountHANDLE mutex_3; // 限制rHANDLE r; // 有没有readerHANDLE 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 100000int 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;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 90后欠30万债务怎么办 赌博输了钱后悔怎么办 借赌博输了80万怎么办 赌博输了50万怎么办 手机赌博输了钱怎么办 内存卡是扩容卡怎么办 坐了过山车想吐怎么办 坐完摇椅想吐怎么办 玩完过山车想吐怎么办 做了过山车想吐怎么办 坐车后恶心想吐怎么办 太胖了想减肥怎么办 被集资诈骗的人怎么办 教了作业没写怎么办 移动4g网速慢怎么办 小孩装病不去上学怎么办 卖衣服顾客嫌贵怎么办 当顾客说再看看怎么办 读完高中没考上大学怎么办 手抖不会写字了怎么办 字认识写不出来怎么办 八四把衣服发黄怎么办 孩孑在学校被打怎么办 在学校有人打我怎么办 孩子在学校不爱说话怎么办 孩子上幼儿园不和小朋友玩怎么办 遇到有人要打你怎么办 被表白了怎么办神回复 学校要发展我该怎么办 如果有人要打你怎么办 梦见有人要杀我怎么办 如果有人要杀我怎么办 梦到有人要杀我怎么办 感觉有人要杀我怎么办 我很自卑 没自信怎么办 如果在学校被打怎么办 如果有人打我该怎么办 别人要砍我我怎么办 专四两次没过怎么办 3岁宝宝害羞胆小怎么办 人太老实被欺负怎么办