进程同步与互斥——生产者/消费者(有界缓冲区)问题源码实现

本文详细探讨了使用信号量解决多线程环境下的生产者-消费者问题,从最初的竞态条件到引入互斥锁避免数据丢失,再到调整锁的作用域防止死锁。通过示例代码展示了如何正确实现有界缓冲区的同步与互斥操作,以确保系统的正确运行。

传送门:

进程同步与互斥——信号量(实现锁、条件变量)

进程同步与互斥——哲学家就餐问题源码实现(dining philosopher’s problem)

进程同步与互斥——读者/写者问题源码实现(reader-writer lock)

进程同步与互斥——生产者/消费者(有界缓冲区)问题源码实现

进程同步与互斥——吸烟者问题源码实现(cigarette smoker’s problem)

进程同步与互斥——理发师问题源码实现(sleeping barber problem)

进程同步与互斥——相关问题汇总(源码+伪代码)

摘自:操作系统导论

第一次尝试

第一次尝试解决该问题时,我们用两个信号量empty和full分别表示缓存区空或者满。put()和get()函数,下面是我们尝试解决生产者/消费者问题的代码。

#define MAX 10

int buffer[MAX];
int fill = 0;
int use = 0;

void put(int value)
{
   
   
	buffer[fill] = value;           //line f1
	fill = (fill + 1) % MAX;
}

int get()

{
   
   
	int tmp = buffer[use];
	use = (use + 1) % MAX;
	return tmp;
}

sem_t empty;
sem_t full;

void *producer(void *arg)
{
   
   
	for(int i = 0; i < loops; i++)
	{
   
   
		sem_wait(&empty);
		put(i);
		sem_post(&full);
	}
}

void *consumer(void *arg)
{
   
   
	int i, tmp = 0;
	while(tmp != -1)
	{
   
   
		sem_wait(&full)
		tmp = get();
		sem_post(&empty);
		printf("%d\n"
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值