吸烟者问题

问题描述

image.png

简单来讲就是说,供应者依次提供一组物品满足一个人吸烟的需求。

问题分析

同步关系:

代码实现

sem table = 1;
sem g1 = 0; // 组1,对应第一个吸烟者,下面可以类比
sem g2 = 0;
sem g3 = 0;
sem mutex = 1;

void provider() {
	while (1) {
		if (i == 0) V(g1);
		else if (i == 1) V(g2);
		else if (i == 2) V(g3);
		i = (i + 1) % 3;
		P(table);
	}
}

void smoker1() {
	while (1) {
		P(g1);
		P(mutex);
		...
		V(mutex);
		V(table);
	}
} 

void smoker2() {
	while (1) {
		P(g2);
		P(mutex);
		...
		V(mutex);
		V(table);
	}
} 

void smoker3() {
	while (1) {
		P(g3);
		P(mutex);
		...
		V(mutex);
		V(table);
	}
}