读者写者模型
来源:互联网 发布:dht网络标示怎么下载 编辑:程序博客网 时间:2024/05/24 00:44
写者优先的写法:
读者优先:
#include <Windows.h>#include <iostream>using namespace std;HANDLE g_RC_Mutex = NULL;HANDLE g_Mutex = NULL;int g_rc = 0;// 死锁???DWORD WINAPI Reader(){ while (true) { WaitForSingleObject(g_RC_Mutex, INFINITE); g_rc += 1; if (g_rc == 1) { //如果是第一个读者,那么限制写者的访问 cout << "第一个读者" << endl; WaitForSingleObject(g_Mutex, INFINITE); } ReleaseMutex(g_RC_Mutex); // 读数据 cout << "读数据" << endl; WaitForSingleObject(g_RC_Mutex, INFINITE); g_rc -= 1; if (g_rc == 0) { //如果是最后一个读者,那么释放以供写者或读者访问 cout << "最后一个读者" << endl; ReleaseMutex(g_Mutex); } ReleaseMutex(g_RC_Mutex); }}DWORD WINAPI Writer(){ while (true) { WaitForSingleObject(g_Mutex, INFINITE); // 写数据 cout << " 写数据" << endl; ReleaseMutex(g_Mutex); }}int main(){ g_RC_Mutex = CreateMutex(NULL, false, NULL); g_Mutex = CreateMutex(NULL, false, NULL); HANDLE hReader = NULL; HANDLE hWriter = NULL; for (int i = 0; i < 2; ++i) { hWriter = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Writer, NULL, 0, NULL); hReader = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Reader, NULL, 0, NULL); } getchar(); return 0;}
写者优先:
#include <Windows.h>#include <iostream>using namespace std;HANDLE x = NULL; // x控制ReadCount的互斥访问,HANDLE y = NULL; // y控制WriteCount的互斥访问HANDLE z = NULL;HANDLE rsem = NULL;HANDLE wsem = NULL; //rsem,wsem分别表示对读和写的互斥控制int ReadCount = 0;int WriteCount = 0;void Reader() {// while (true)// { WaitForSingleObject(z, INFINITE); //z保证写跳过读,做到写优先 WaitForSingleObject(rsem, INFINITE); //控制对读的访问,如果有写者,那么此处不成功 WaitForSingleObject(x, INFINITE); //对RC的互斥控制 ReadCount++; if(ReadCount == 1) { WaitForSingleObject(wsem, INFINITE); //第一个读者出现后,锁住不让写 } ReleaseMutex(x); ReleaseMutex(rsem); //释放读的访问,以使其他读者进入 ReleaseMutex(z); //读数据... cout << "读数据" << endl; WaitForSingleObject(x, INFINITE); ReadCount--; if(ReadCount == 0) { ReleaseMutex(wsem); //如果是最后一个读者,释放对写的信号 } ReleaseMutex(x);// }}void Writer() {// while (true)// { WaitForSingleObject(y, INFINITE); WriteCount++; if(WriteCount == 1) { WaitForSingleObject(rsem, INFINITE); } ReleaseMutex(y); WaitForSingleObject(wsem, INFINITE); //写数据... cout << "写数据" << endl; ReleaseMutex(wsem); WaitForSingleObject(y, INFINITE); WriteCount--; if(WriteCount == 0) { ReleaseMutex(rsem); } ReleaseMutex(y);// }}int main(){ x = CreateMutex(NULL, false, NULL); y = CreateMutex(NULL, false, NULL); z = CreateMutex(NULL, false, NULL); rsem = CreateMutex(NULL, false, NULL); wsem = CreateMutex(NULL, false, NULL); HANDLE hReader = NULL; HANDLE hWriter = NULL; for (int i = 0; i < 5; ++i) { hReader = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Reader, NULL, 0, NULL); hWriter = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Writer, NULL, 0, NULL); CloseHandle(hReader); CloseHandle(hWriter); } getchar(); return 0;}
阅读全文
1 0
- 读者写者模型
- 读者写者模型
- 读者-写者模型
- 读者写者模型
- 读者写者模型
- 读者写者模型
- 读者_写者模型
- 浅析读者写者模型
- Linux---读者写者模型
- linux:读者写者模型
- Java并发之读者写者模型
- 例说读者写者模型
- 生产者消费者模型和读者写者模型
- 读者写者模型与生产者消费者模型
- 读者写者问题
- 读者写者问题
- 读者-写者问题
- 读者-写者优先
- Linux启动过程详解
- 关于ERROR] Nested in org.springframework.beans.factory.BeanCreationException: Error creating bean with
- ThinkPHP集成极光推送简单实例
- kill 9与kill -9
- C语言基础——数组(及一些常用的函数介绍)
- 读者写者模型
- 百练_2709:求出e的值
- 静态方法与单例模式的区别
- easyui datagrid 如何控制删除最后一行
- Hadoop之网站日志分析项目案例(一)介绍(笔记21)
- WPF ItemSource绑定的问题
- MySQL获取表中各字段的注释
- centos7 下php+mysql+php7编译安装
- html无序列表横向水平居中的解决方法