1. 程式人生 > >程序同步之讀者寫者問題C語言實現

程序同步之讀者寫者問題C語言實現

注:該程式可在vs2017版本執行或者vc++將執行緒調整為多執行緒方可使用,在VC上執行時,需將第一個標頭檔案#include "stdafx.h"刪掉#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#include <process.h>#include <windows.h>#include <time.h>typedef struct thread {int thread_num;char state;int waittime;int runtime;}ojbk;ojbk a[50];int count = 0;int read = 1;  //讀者佔用的變數int mutex = 1;//兩者共用互斥變數void P(int m,int n,int pid,char s);void V(int n,int pid,char s);void reader(ojbk a[],int i);void write(ojbk a[], int i);void print_a(int x);unsigned int _stdcall ThreadFun1(void *pM){int i;i = (int)pM;reader(a,i);return 0;}unsigned int _stdcall ThreadFun2(void *pM){int i;i = (int)pM;write(a,i);return 0;}int main(){int x, i;char isprime;srand((int)time(NULL));printf("請輸入您要建立的執行緒個數:\n");scanf("%d",&x);for (i = 0; i<x; i++) {a[i].thread_num = i;a[i].waittime = rand() % 10 + 1;a[i].runtime = rand() % 8 + 1;if ((rand() % 50)<25) {a[i].state = 'R';}else {a[i].state = 'W';}}print_a(x);HANDLE handle[100];i=0;printf("\n請選擇您要執行的操作\n");printf("讀者優先: 1   \n");printf("寫者優先: 2   \n");printf("其他    : 退出\n\n");scanf("%d",&isprime);printf("\n");switch(isprime){case 1 :while (i<x) {handle[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun1, (void *)i, 0, NULL);i++;}break;case 2 :while (i<x) {handle[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun2, (void *)i, 0, NULL);i++;}break;default :printf("退出程式\n");exit(0);}WaitForMultipleObjects(x, handle, TRUE, 1000000
);return 0;}void print_a(int x) {int i;printf("\n");for (i = 0; i < x; i++) {if (a[i].state == 'W'){count++;}printf("%d\t%c\t%d\t%d\n", a[i].thread_num, a[i].state, a[i].waittime, a[i].runtime);}printf("\n");}void P(int m,int n,int pid,char s){printf("執行緒號為%d的%c建立完成\n",pid,s);printf("執行緒號為%d的%c等待中...\n",pid,s);Sleep(m * 1000);V(n,pid,s);};void V(int n,int pid,char s){printf("執行緒號為%d的%c執行中...\n",pid,s);Sleep(n * 1000);printf("執行緒號為%d的%c執行結束!!!\n",pid,s);}void reader(ojbk a[], int i){while (1) {if (a[i].state == 'R'&&read == 1) {mutex -= 1;P(a[i].waittime,a[i].runtime,a[i].thread_num,a[i].state );mutex += 1;break;}else if (a[i].state == 'W'&&mutex == 1) {mutex-= 1;read-= 1;P(a[i].waittime, a[i].runtime, a[i].thread_num,a[i].state );mutex+= 1;read+= 1;break;}else Sleep(100);}}void write(ojbk a[], int i) {while (1) {if (a[i].state == 'R'&&count==0) {P(a[i].waittime, a[i].runtime, a[i].thread_num,a[i].state );break;}else if (a[i].state == 'W'&&count!=0&&read==1) {read -= 1;P(a[i].waittime, a[i].runtime, a[i].thread_num,a[i].state );read += 1;count--;break;}else Sleep(100);}}