我已经为男女皆宜的浴室同步提出了以下解决方案。
问题有以下限制:
有关问题的详细说明,请参阅link。
下面提到的解决方案是否满足所有问题约束?
伪码
int female_cnt = 0;
mutex female_cnt_mutex;
int male_cnt = 0;
mutex male_cnt_mutex;
mutex female_mutex;
mutex male_mutex;
semaphore restroom = N;
female()
{
lock(female_mutex)
unlock(female_mutex)
lock(female_cnt_mutex)
female_cnt++;
if (female_cnt == 1)
lock(male_mutex)
unlock(female_cnt_mutex)
wait(restroom)
do_stuff();
signal(restroom)
lock(female_cnt_mutex)
female_cnt--;
if (female_cnt == 0)
unlock(male_mutex)
unlock(female_cnt_mutex)
}
male()
{
lock(male_mutex)
unlock(male_mutex)
lock(male_cnt_mutex)
male_cnt++;
if (male_cnt == 1)
lock(female_mutex)
unlock(male_cnt_mutex)
wait(restroom)
do_stuff();
signal(restroom)
lock(male_cnt_mutex)
male_cnt--;
if (male_cnt == 0)
unlock(female_mutex)
unlock(male_cnt_mutex)
}
答案 0 :(得分:2)
清空关键部分
lock( female_mutex )
unlock( female_mutex )
在female
函数的开头不会阻止male()和female()同时执行。
如果female()
在male()
执行代码之后通过此关键部分的空关键部分之后,则没有任何内容阻止这两个函数继续执行wait( restroom )
。这样他们违反了第二条要求。