標籤:class blog code ext 2014 問題
讀者優先
//讀者寫者問題-讀者優先#include<stdio.h>#include<process.h>#include<windows.h>using namespace std;HANDLE rmutex,wmutex;int Readcount=0;int read_num=10,write_num=5;DWORD WINAPI read(LPVOID lpParam){ WaitForSingleObject(rmutex,INFINITE); if(Readcount==0) { WaitForSingleObject(wmutex,INFINITE); printf("讀者 %s-------------------------對wmutex已加鎖\n",lpParam); } Readcount++; ReleaseMutex(rmutex); printf("讀者 %s 開始讀操作\n",lpParam); for(int i=0;i<5;i++) { Sleep(1); printf("讀者 %s 正在讀\n"); } printf("讀者 %s 讀操作完畢\n",lpParam); WaitForSingleObject(rmutex,INFINITE); Readcount--; if(Readcount==0) { ReleaseMutex(wmutex); printf("讀者 %s-------------------------對wmutex已解鎖\n",lpParam); } ReleaseMutex(rmutex); printf("讀者 %s ******死亡\n",lpParam); //Sleep(10000); while(true) { Sleep(100); if(Readcount==0) { ReleaseMutex(wmutex); break; } } Sleep(10000);}DWORD WINAPI write(LPVOID lpParam){ WaitForSingleObject(wmutex,INFINITE); printf("寫者 %s-------------------------對wmutex已加鎖\n",lpParam); printf("寫者 %s 開始寫操作\n",lpParam); for(int i=0;i<5;i++) { Sleep(1); printf("寫者 %s 正在寫\n"); } printf("寫者 %s 寫操作完畢\n",lpParam); ReleaseMutex(wmutex); printf("寫者 %s-------------------------對wmutext已解鎖\n",lpParam); printf("寫者 %s ******死亡\n"); Sleep(10000);}int main(){ rmutex=CreateMutex(NULL,false,NULL); wmutex=CreateMutex(NULL,false,NULL); char *r[10]={"a","b","c","d","e","f","g","h","i","j"}; char *w[5]={"a","b","c","d","e"}; for(int i=0;i<read_num;i++) { printf("讀者 %s 建立並申請讀\n",r[i]); CreateThread(NULL,0,read,r[i],0,NULL); if(i>=5) { printf("寫者 %s 建立並申請寫\n",w[i-5]); CreateThread(NULL,0,write,w[i-5],0,NULL); } } Sleep(10000); return 0;}
寫者優先
//讀者寫者問題-寫者優先#include<stdio.h>#include<windows.h>using namespace std;HANDLE rmutex,wmutex,rwmutex;int Readcount=0;int read_num=10,write_num=5;DWORD WINAPI read(LPVOID lpParam){ WaitForSingleObject(rwmutex,INFINITE); ReleaseMutex(rwmutex); WaitForSingleObject(rmutex,INFINITE); if(Readcount==0) { WaitForSingleObject(wmutex,INFINITE); printf("讀者 %s-------------------------對wmutex已加鎖\n",lpParam); } Readcount++; ReleaseMutex(rmutex); //read操作 printf("讀者 %s 開始讀操作\n",lpParam); for(int i=0; i<5; i++) { Sleep(1); printf("讀者 %s 正在讀\n"); } printf("讀者 %s 讀操作完畢\n",lpParam); WaitForSingleObject(rmutex,INFINITE); Readcount--; if(Readcount==0) { ReleaseMutex(wmutex); printf("讀者 %s-------------------------對wmutex已解鎖\n",lpParam); } ReleaseMutex(rmutex); printf("讀者 %s ******死亡\n",lpParam); while(true) { Sleep(100); if(Readcount==0) { ReleaseMutex(wmutex); break; } } Sleep(10000);}DWORD WINAPI write(LPVOID lpParam){ WaitForSingleObject(rwmutex,INFINITE); WaitForSingleObject(wmutex,INFINITE); printf("寫者 %s-------------------------對wmutex已加鎖\n",lpParam); printf("寫者 %s 開始寫操作\n",lpParam); for(int i=0; i<5; i++) { Sleep(1); printf("寫者 %s 正在寫\n"); } printf("寫者 %s 寫操作完畢\n",lpParam); ReleaseMutex(wmutex); printf("寫者 %s-------------------------對wmutext已解鎖\n",lpParam); printf("寫者 %s ******死亡\n"); ReleaseMutex(rwmutex); Sleep(10000);}int main(){ rmutex=CreateMutex(NULL,false,NULL); wmutex=CreateMutex(NULL,false,NULL); rwmutex=CreateMutex(NULL,false,NULL); char *r[10]= {"a","b","c","d","e","f","g","h","i","j"}; char *w[5]= {"a","b","c","d","e"}; for(int i=0; i<read_num; i++) { printf("讀者 %s 建立並申請讀\n",r[i]); CreateThread(NULL,0,read,r[i],0,NULL); if(i>=5) { printf("寫者 %s 建立並申請寫\n",w[i-5]); CreateThread(NULL,0,write,w[i-5],0,NULL); } } Sleep(10000); return 0;}