|
|
|
|
@ -4,30 +4,30 @@
|
|
|
|
|
#include <unistd.h>
|
|
|
|
|
#include <sys/types.h>
|
|
|
|
|
#include <semaphore.h>
|
|
|
|
|
int n=10, in=0,out=0,buffer[10];//定义变量并创建数组。
|
|
|
|
|
sem_t empty,full;//定义信号量
|
|
|
|
|
int n=10, in=0,out=0,buffer[10];
|
|
|
|
|
sem_t empty,full;
|
|
|
|
|
|
|
|
|
|
void* producer(void *arg){
|
|
|
|
|
int tag= pthread_self()%100;//线程信号
|
|
|
|
|
int tag= pthread_self()%100;
|
|
|
|
|
int nextPro;
|
|
|
|
|
srand(time(NULL)+tag);//随机数种子
|
|
|
|
|
srand(time(NULL)+tag);
|
|
|
|
|
while(1){
|
|
|
|
|
nextPro = rand()%97;
|
|
|
|
|
sem_wait(&empty);//empty–1
|
|
|
|
|
sem_wait(&empty);
|
|
|
|
|
buffer[in] = nextPro;
|
|
|
|
|
printf("production:%d %d\n",nextPro,buffer[in]);
|
|
|
|
|
usleep(1000*1000/20);
|
|
|
|
|
in = (in+1)%n;
|
|
|
|
|
sem_post(&full);//full+1
|
|
|
|
|
sem_post(&full);
|
|
|
|
|
usleep(1000*1000/2);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
void* consumer(void *arg) {
|
|
|
|
|
int item;
|
|
|
|
|
while(1){
|
|
|
|
|
sem_wait(&full)//full–1
|
|
|
|
|
sem_wait(&full);
|
|
|
|
|
item = buffer[out];
|
|
|
|
|
sem_post(&empty);//empty+1
|
|
|
|
|
sem_post(&empty);
|
|
|
|
|
printf("consume:%d\n",buffer[out]);
|
|
|
|
|
out = (out+1)%n;
|
|
|
|
|
usleep(1000*1000/10);
|
|
|
|
|
@ -35,12 +35,13 @@ void* consumer(void *arg) {
|
|
|
|
|
}
|
|
|
|
|
int main() {
|
|
|
|
|
pthread_t tid[7];
|
|
|
|
|
//初始有10个缓冲区
|
|
|
|
|
sem_init( &empty, 0,10);
|
|
|
|
|
sem_init( &full, 0,0);//初始化信号量
|
|
|
|
|
sem_init( &full, 0,0);
|
|
|
|
|
for(int i=0;i<6;i++)
|
|
|
|
|
pthread_create(&tid[i], NULL, producer, NULL);//创建生产者
|
|
|
|
|
pthread_create(&tid[6], NULL, consumer, NULL);//创建消费者
|
|
|
|
|
pthread_create(&tid[i], NULL, producer, NULL);
|
|
|
|
|
pthread_create(&tid[6], NULL, consumer, NULL);
|
|
|
|
|
for(int i = 0; i<7; i++)
|
|
|
|
|
pthread_join(tid[i], NULL);//等待线程结束
|
|
|
|
|
pthread_join(tid[i], NULL);
|
|
|
|
|
printf("main is over\n");
|
|
|
|
|
}
|