// セマフォーによる生産者・消費者問題 #include "stdafx.h" #include "string.h" #include "conio.h" #include "process.h" #include "windows.h" #define MAXQUE 5 typedef struct{ int Start,End, data[MAXQUE]; } QueData; QueData Que={0,0,0};int numP=2, Signal=true; int full=0, empty=MAXQUE,mutex=1; int emptyQue(){ if(Que.Start==Que.End) return true; return false; } int fullQue(){ int next=Que.End+1;if(next>=MAXQUE) next=0; if(Que.Start==next) return true; return false; } int enQue(int Value){ if(fullQue())return true; Que.data[Que.End]=Value; Que.End++; if(Que.End>=MAXQUE) Que.End=0; return false; } int deQue(){ if(emptyQue()) return 0x8000; int R = Que.data[Que.Start]; Que.Start++; if(Que.Start>=MAXQUE) Que.Start=0; return R; } void P(int *S){while((*S<=0)&& !Signal);(*S)--;} void V(int *S){(*S)++;} void Producer(void *a){ int L=0; while(1){ L++; if(L>100)L=0; P(&empty);P(&mutex); if(!Signal){numP--;return;} if(enQue(L))printf("\n Producer ** can't enQue for full Que"); else printf("\n Producer %d",L); V(&mutex);V(&full); Sleep(2L); if(getch()==26){Signal=false;numP--;return;} } } void Consumer(void *a){ int L=0; while(1){ P(&full);P(&mutex); if(!Signal){numP--;return;} L=deQue(); if(L==0x8000) printf("\n Consumer ** can't deQue for empty Que"); else printf("\n Consumer %d",L); V(&mutex);V(&empty); Sleep(2L); if(getch()==26){Signal=false;numP--;return;} } } int _tmain(int argc, _TCHAR* argv[]) { int A = 1, B = 2; HANDLE H1=(HANDLE) _beginthread(Producer,0,(void *)A); HANDLE H2=(HANDLE) _beginthread(Consumer,0,(void *)B); while(numP!=0);printf("\n ***End"); getch(); return 0; }