男女皆宜的浴室同步

时间:2015-10-28 19:08:05

标签: multithreading synchronization

我已经为男女皆宜的浴室同步提出了以下解决方案。

问题有以下限制:

  • 共用浴室容量有限。
  • 男性和女性不能同时使用浴室
  • 个人将花费任意时间使用浴室
  • 个人不喜欢等待使用浴室(最小化等待时间)
  • 解决方案不应该偏向于男性或女性。

有关问题的详细说明,请参阅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)
}

1 个答案:

答案 0 :(得分:2)

清空关键部分

    lock( female_mutex )
    unlock( female_mutex )

female函数的开头不会阻止male()和female()同时执行

如果female()male()执行代码之后通过此关键部分的空关键部分之后,则没有任何内容阻止这两个函数继续执行wait( restroom )。这样他们违反了第二条要求。