进程同步之读者写者问题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);
}
}

猜你喜欢

转载自blog.csdn.net/qq_40394168/article/details/80437824