有一个生产者进程,有两个消费者进程。生产者产生1-100的100个数。两个消费者从共享内存中取数。/**//*windows 部分*/// Thread.cpp : 定义控制台应用程序的入口点。//-----------Windows下生产者、消费者实例程序---------------------//--------------author:zhangwei----------------------------------//--------------Date 12/10/2004---------------------------------#include "stdafx.h"//作为仓库存放数据,最多可以放五个数据int array[5];//记录生成数据的个数int pointer;//记录取得的数据的位置int pointerget;//用来保存数据和int sum;//临界区对象CRITICAL_SECTION csArray;//句柄,保存Full信号量HANDLE hFull;//句柄,保存Empty信号量HANDLE hEmpty;//生产者函数DWORD WINAPI Producer(LPVOID lpParam)...{ int i = 0; pointer = 0; while( i < 100 ) ...{ WaitForSingleObject(hEmpty,INFINITE); EnterCriticalSection( &csArray); array[(pointer++)%5] = i + 1; LeaveCriticalSection( &csArray); ReleaseSemaphore(hFull,1,NULL); i++; } return 0;}//消费者函数ADWORD WINAPI ConsumerA(LPVOID lpParam)...{ while(1) ...{ WaitForSingleObject(hFull,INFINITE); EnterCriticalSection( &csArray); sum += array[(pointerget ++ )%5]; printf("ConsumerA get %d ",array[(pointerget -1)%5]); if(pointerget == 100) printf("The sum is %d",sum); LeaveCriticalSection( &csArray); ReleaseSemaphore(hEmpty,1,NULL); } return 0;}//消费者函数BDWORD WINAPI ConsumerB(LPVOID lpParam)...{ while(1) ...{ WaitForSingleObject(hFull,INFINITE); EnterCriticalSection( &csArray); sum += array[(pointerget ++ )%5]; printf("ConsumerB get %d ",array[(pointerget -1 )%5]); if(pointerget == 100) printf("The sum is %d",sum); LeaveCriticalSection( &csArray); ReleaseSemaphore(hEmpty,1,NULL); } return 0;}//主函数void main()...{ HANDLE hThreadProducer,hThreadConsumerA,hThreadComsumerB; sum = 0; pointerget = 0; InitializeCriticalSection( &csArray); hFull = CreateSemaphore(NULL,0,5,NULL); hEmpty = CreateSemaphore(NULL,5,5,NULL); hThreadProducer = CreateThread(NULL,0, Producer,NULL,0,NULL); hThreadConsumerA = CreateThread(NULL,0, ConsumerA,NULL,0,NULL); hThreadComsumerB = CreateThread(NULL,0, ConsumerB,NULL,0,NULL); _getch();}/**//*Linux 部分*/#include <sys/mman.h>#include <sys/types.h>#include <linux/sem.h>#include <fcntl.h>#include <unistd.h>#include <stdio.h>#include <errno.h>#include <time.h>#define MAXSEM 5//声明三个信号灯IDint fullid;int emptyid;int mutxid;int main()...{ struct sembuf P,V;; union semun arg; //声明共享内存 int *array; int *sum; int *set; int *get; //映射共享内存 array = (int *)mmap(NULL , sizeof( int )*5,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0); sum = (int *)mmap(NULL , sizeof( int ),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0); get = (int *)mmap(NULL , sizeof( int ),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0); set = (int *)mmap(NULL , sizeof( int ),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0); *sum = 0; *get = 0; *set = 0; //生成信号灯 fullid= semget(IPC_PRIVATE,1,IPC_CREAT|00666); emptyid=semget(IPC_PRIVATE,1,IPC_CREAT|00666); mutxid=semget(IPC_PRIVATE,1,IPC_CREAT|00666); //为信号灯赋值 arg.val = 0; if(semctl(fullid , 0 , SETVAL , arg) == -1) perror("semctl setval error"); arg.val = MAXSEM; if(semctl(emptyid , 0 ,SETVAL , arg) == -1) perror("semctl setval error"); arg.val = 1; if(semctl(mutxid , 0 ,SETVAL , arg) == -1) perror("setctl setval error"); //初始化P,V操作 V.sem_num=0; V.sem_op =1; V.sem_flg=SEM_UNDO; P.sem_num=0; P.sem_op =-1; P.sem_flg=SEM_UNDO; //生产者进程 if(fork() == 0 ) ...{ int i = 0; while( i < 100) ...{ semop(emptyid , &P ,1 ); semop(mutxid , &P , 1); array[*(set)%MAXSEM] = i + 1; printf("Producer %d ", array[(*set)%MAXSEM]); (*set)++; semop(mutxid , &V , 1); semop(fullid , &V , 1); i++; } sleep(10); printf("Producer is over"); exit(0); }else ...{ //ConsumerA 进程 if(fork()==0) ...{ while(1)...{ semop(fullid , &P , 1); semop(mutxid , &P , 1); if(*get == 100) break; *sum += array[(*get)%MAXSEM]; printf("The ComsumerA Get Number %d ", array[(*get)%MAXSEM] ); (*get)++; if( *get ==100) printf("The sum is %d ", *sum); semop(mutxid , &V , 1); semop(emptyid , &V ,1 ); sleep(1); } printf("ConsumerA is over"); exit(0); }else ...{ //Consumer B进程 if(fork()==0) ...{ while(1)...{ semop(fullid , &P , 1); semop(mutxid , &P , 1); if(*get == 100) break; *sum += array[(*get)%MAXSEM]; printf("The ComsumerB Get Number %d ", array[(*get)%MAXSEM] ); (*get)++; if( *get ==100) printf("The sum is %d ", *sum); semop(mutxid , &V , 1); semop(emptyid , &V ,1 ); sleep(1); } printf("ConsumerB is over"); exit(0); } } } // sleep(20); return 0;}