/*用线程的同步和互斥来实现"生产者-消费者"问题.*/
/*
多生产者多消费者多缓冲区 生产者和消费者不可同时进行
*/
#include <stdio.h>
#include <stdlib.h>
//#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#include <time.h>
#define M 10 // 缓冲数目
int in = 0; // 生产者放置产品的位置
int out = 0; // 消费者取产品的位置
int buff[M] = {0}; // 缓冲初始化为0,开始时没有产品
int buffer=0; //单缓冲
sem_t empty_sem; // 同步信号量, 当满了时阻止生产者放产品
sem_t full_sem; // 同步信号量, 当没产品时阻止消费者消费
pthread_mutex_t mutex; // 互斥信号量, 一次只有一个线程访问缓冲
int product_id = 0; //生产者id
int consumer_id = 0; //消费者id
int product_sum=0;
int consumer_sum=0;
struct timeval start; //记录时间
struct timeval end;
unsigned long timer;
/* 打印缓冲情况 */
void print()
{
int i;
for(i = 0; i < M; i++)
printf("%d ", buff[i]);
}
/* 生产者方法 (多缓冲)*/
void *product(void * arg)
{
int id = ++product_id;
int t=*(int *)arg; //t生产者生产时间
while(1)
{
// 用sleep的数量可以调节生产和消费的速度,便于观察
sleep(t);
//sleep(1);
sem_wait(&empty_sem);
pthread_mutex_lock(&mutex);
gettimeofday(&end,NULL); //生产开始时间
in = in % M;
product_sum++;
timer = 1000000 * (end.tv_sec-start.tv_sec)+ end.tv_usec-start.tv_usec;
printf("time:%ldus product_%d in %d. buffer: ", timer,id, in+1);
//printf("timer = %ld us\n",timer);
buff[in] = 1;
print();
printf("\t%d\n",product_sum);
++in;
pthread_mutex_unlock(&mutex);
sem_post(&full_sem);
}
}
/* 生产者方法 (单缓冲)*/
void *product1(void * arg)
{
int id = ++product_id;
int t=*(int *)arg;
while(1)
{
sleep(t);
sem_wait(&empty_sem);
pthread_mutex_lock(&mutex);
gettimeofday(&end,NULL);
product_sum++;
timer = 1000000 * (end.tv_sec-start.tv_sec)+ end.tv_usec-start.tv_usec;
printf("time:%ld product_%d is producing.SUM=%d\n",timer,id,product_sum);
buffer=1;
pthread_mutex_unlock(&mutex);
sem_post(&full_sem);
}
}
/* 生产者方法 交换wait(metux) wait(empty)*/
void *product2(void * arg)
{
int id = ++product_id;
int t=*(int *)arg;
while(1)
{
sleep(t);
//sleep(1);
pthread_mut
Linux下多线程模拟生产者/消费者问题
最新推荐文章于 2022-09-14 23:23:35 发布