Linux下多线程模拟生产者/消费者问题

这段代码展示了如何在Linux环境下使用多线程和信号量实现生产者-消费者问题。通过不同生产者和消费者的模拟,演示了线程同步和互斥的概念,包括多缓冲和单缓冲两种情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*用线程的同步和互斥来实现"生产者-消费者"问题.*/
/*
多生产者多消费者多缓冲区 生产者和消费者不可同时进行
*/
#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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值