传送门:
进程同步与互斥——哲学家就餐问题源码实现(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"

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

被折叠的 条评论
为什么被折叠?



