多线程PV
1 #include <STDIO.H> 2 #include <windows.h> 3 //#include "stdafx.h" 4 #include <process.h> // _beginthread && _endthread 5 //#include "BaseOperation.h" 6 #define N 10 7 8 typedef int semaphore; /* 信号量是一种特殊的整型变量 */ 9 10 semaphore mutex=1; /* 互斥访问 */ 11 semaphore empty=N; /* 记录缓冲池中空的缓冲区数 */ 12 semaphore full=0; /* 记录缓冲池中满的缓冲区数*/ 13 14 semaphore buf[N]; /* 有N个缓冲区数的缓冲池buf[N],并实现循环缓冲队列 */ 15 semaphore in=0, out=0; 16 17 void p(semaphore *x) /* p操作 */ 18 { 19 *x=(*x)-1; 20 } 21 22 void v(semaphore *y) /* v操作 */ 23 { 24 *y=(*y)+1; 25 } 26 27 void produce_item(int *item_ptr) 28 { 29 /*printf("produce an item\n");*/ 30 *item_ptr='F'; /* 'F' is "Full满" */ 31 } 32 33 void enter_item(int x) 34 { 35 in=(out+1)%N; 36 buf[in]=x; 37 printf("enter_item %c to buf[%d]\n", buf[in], in); 38 } 39 40 void remove_item(int *yy) 41 { 42 out=(out+1)%N; 43 printf("remove_item %c from buf[%d]", buf[out], out); 44 *yy=buf[out]; 45 buf[out]='E'; /* 'E' is "Empty空" */ 46 printf(" so the buf[%d] changed to empty--%c\n", out, buf[out]); 47 } 48 void consume_item(int y) 49 { 50 printf("cosume the item :the screem print %c\n", y); 51 } 52 53 void producer(void); 54 void consumer(void); 55 int item; 56 DWORD WINAPI ThreadProc1( LPVOID lpParam ) 57 { 58 59 int i=0,j=0; 60 while(1) 61 { 62 produce_item(&item); 63 64 //延时 65 for(i=0;i<200000000;i++) 66 { 67 ; 68 } 69 } 70 } 71 /* 生产者 */ 72 73 DWORD WINAPI ThreadProc2( LPVOID lpParam ) 74 { 75 76 int i=0,j=0; 77 while(1) 78 { 79 consumer(); 80 81 //延时 82 for(i=0;i<200000000;i++) 83 { 84 ; 85 } 86 } 87 } 88 89 void producer(void) 90 { 91 92 93 while(1){ 94 //_beginthread(produce_item(&item),0,NULL); 95 CreateThread( 96 NULL, // default security attributes 97 0, // use default stack size 98 ThreadProc1, // thread function 99 NULL, // argument to thread function 100 0, // use default creation flags 101 NULL); // returns the thread identifier 102 p(&empty); /* 递减空缓冲区数 */ 103 p(&mutex); /* 进入临界区 */ 104 enter_item(item); /* 将一个新的数据项放入缓冲池 */ 105 v(&mutex); /* 离开临界区 */ 106 v(&full); /* 递增满缓冲区数 */ 107 if(full==N) /* 若缓冲池满的话,唤醒消费者进程 */ 108 CreateThread( 109 NULL, // default security attributes 110 0, // use default stack size 111 ThreadProc2, // thread function 112 NULL, // argument to thread function 113 0, // use default creation flags 114 NULL); // returns the thread identifier 115 } 116 } 117 118 /* 消费者 */ 119 void consumer(void) 120 { 121 int get_item; 122 123 while(1){ 124 p(&full); /* 递减满缓冲区数 */ 125 p(&mutex); /* 进入临界区 */ 126 remove_item(&get_item); /* 从缓冲池中取走一个数据项 */ 127 v(&mutex); /* 离开临界区 */ 128 v(&empty); /* 递增空缓冲区数 */ 129 consume_item(get_item); /* 对数据项进行操作(消费)*/ 130 if(empty==N) /* 若缓冲池全空的话,唤生产者进程 */ 131 producer(); 132 } 133 } 134 135 /* 调用生产者-消费者进程实现进程间同步 */ 136 main() 137 { 138 producer(); 139 140 return 0; 141 }
1 #include <STDIO.H> 2 #include <windows.h> 3 //#include "stdafx.h" 4 #include <process.h> // _beginthread && _endthread 5 //#include "BaseOperation.h" 6 #define N 10 7 8 typedef int semaphore; /* 信号量是一种特殊的整型变量 */ 9 10 semaphore mutex=1; /* 互斥访问 */ 11 semaphore empty=N; /* 记录缓冲池中空的缓冲区数 */ 12 semaphore full=0; /* 记录缓冲池中满的缓冲区数*/ 13 14 semaphore buf[N]; /* 有N个缓冲区数的缓冲池buf[N],并实现循环缓冲队列 */ 15 semaphore in=0, out=0; 16 17 void p(semaphore *x) /* p操作 */ 18 { 19 *x=(*x)-1; 20 } 21 22 void v(semaphore *y) /* v操作 */ 23 { 24 *y=(*y)+1; 25 } 26 27 void produce_item(int *item_ptr) 28 { 29 /*printf("produce an item\n");*/ 30 *item_ptr='F'; /* 'F' is "Full满" */ 31 } 32 33 void enter_item(int x) 34 { 35 in=(out+1)%N; 36 buf[in]=x; 37 printf("enter_item %c to buf[%d]\n", buf[in], in); 38 } 39 40 void remove_item(int *yy) 41 { 42 out=(out+1)%N; 43 printf("remove_item %c from buf[%d]", buf[out], out); 44 *yy=buf[out]; 45 buf[out]='E'; /* 'E' is "Empty空" */ 46 printf(" so the buf[%d] changed to empty--%c\n", out, buf[out]); 47 } 48 void consume_item(int y) 49 { 50 printf("cosume the item :the screem print %c\n", y); 51 } 52 53 void producer(void); 54 void consumer(void); 55 int item; 56 DWORD WINAPI ThreadProc1( LPVOID lpParam ) 57 { 58 59 int i=0,j=0; 60 while(1) 61 { 62 produce_item(&item); 63 64 //延时 65 Sleep(1); 66 } 67 } 68 /* 生产者 */ 69 70 DWORD WINAPI ThreadProc2( LPVOID lpParam ) 71 { 72 73 int i=0,j=0; 74 while(1) 75 { 76 consumer(); 77 78 //延时 79 Sleep(1); 80 } 81 } 82 83 void producer(void) 84 { 85 86 87 while(1){ 88 //_beginthread(produce_item(&item),0,NULL); 89 CreateThread( 90 NULL, // default security attributes 91 0, // use default stack size 92 ThreadProc1, // thread function 93 NULL, // argument to thread function 94 0, // use default creation flags 95 NULL); // returns the thread identifier 96 p(&empty); /* 递减空缓冲区数 */ 97 p(&mutex); /* 进入临界区 */ 98 enter_item(item); /* 将一个新的数据项放入缓冲池 */ 99 v(&mutex); /* 离开临界区 */ 100 v(&full); /* 递增满缓冲区数 */ 101 if(full==N) /* 若缓冲池满的话,唤醒消费者进程 */ 102 CreateThread( 103 NULL, // default security attributes 104 0, // use default stack size 105 ThreadProc2, // thread function 106 NULL, // argument to thread function 107 0, // use default creation flags 108 NULL); // returns the thread identifier 109 } 110 } 111 112 /* 消费者 */ 113 void consumer(void) 114 { 115 int get_item; 116 117 while(1){ 118 p(&full); /* 递减满缓冲区数 */ 119 p(&mutex); /* 进入临界区 */ 120 remove_item(&get_item); /* 从缓冲池中取走一个数据项 */ 121 v(&mutex); /* 离开临界区 */ 122 v(&empty); /* 递增空缓冲区数 */ 123 consume_item(get_item); /* 对数据项进行操作(消费)*/ 124 if(empty==N) /* 若缓冲池全空的话,唤生产者进程 */ 125 producer(); 126 } 127 } 128 129 /* 调用生产者-消费者进程实现进程间同步 */ 130 main() 131 { 132 producer(); 133 134 return 0; 135 }