生产者与消费者2.0——互斥量

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <string.h>

// 定义结构体变量
struct _data
{
	char *buf[10];
	sem_t full; 
	sem_t empty;
	int count;
}data;

// 初始化互斥量
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

// 生产者工作函数
void *producer(void *v)
{
	char *buf[] = {"苹果", "梨", "波罗蜜", "山竹"};
	int len = sizeof(buf) / sizeof(buf[0]);
	
	while(1)
	{
		usleep(100000*(rand()%10+1));
		
		// 如果信号量的值为0,就等待
		// 然后减1
		// 初始化为10
		sem_wait(&data.empty);
		pthread_mutex_lock(&mutex);
		
		data.buf[data.count] = buf[rand()%len];
		data.count++;
		
		pthread_mutex_unlock(&mutex);
		sem_post(&data.full);
	}
}

// 消费者
void *customer (void *v)
{
	long num = (long)v;
	
	while(1)
	{
		usleep(100000*(rand()%10+1));
		
		// 如果信号量的值为0,就等待
		// 然后减1
		// 初始化为0
		// 生产者生产后,该信号量加了1,此时消费者可以吃了
		sem_wait(&data.full);
		pthread_mutex_lock(&mutex);
		
		int index = rand()%data.count;
		printf ("%ld 消费者吃了一个 %s,剩余个数%d\n", num, data.buf[index], data.count-1);
		data.count--;
		
		char *tmp = data.buf[data.count];
		data.buf[data.count] = data.buf[index];
		data.buf[index] = tmp;
		
		pthread_mutex_unlock(&mutex);
		sem_post(&data.empty);
	}
}

// 生产者与消费者
int main()
{
	srand((unsigned int)time(NULL));
	
	pthread_t thread;
	
	long i;
	
	for (i = 0; i < 4; i++)
	{
		pthread_create(&thread, NULL, customer, (void *)(i+1));
		pthread_detach(thread);
	}
	
	for (i = 0; i < 4; i++)
	{
		pthread_create(&thread, NULL, producer, NULL);
		pthread_detach(thread);
	}
	
	sem_init(&data.full, 0, 0);
	sem_init(&data.empty, 0, 10);
	
	pthread_exit(NULL);
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值