【问题标题】:How to synchronise 3 processes with one semaphore?如何用一个信号量同步 3 个进程?
【发布时间】:2020-03-21 06:11:05
【问题描述】:

我收到了一项任务,用一个信号量同步 3 个任务。

前两个任务生成随机数,第三个任务打印其总和。

所以前两个任务应该在开头执行,第三个任务应该在最后执行。到目前为止,下面的代码给了我最接近我想要实现的结果,但是它显然不时会陷入僵局,我无法找到一种只用一个信号量来解决这个问题的方法:(

semaphore sem;

int var1;
int var2;

void rndo(int& var) {
    int i;
    wait(sem);
    var = random(10);
    cout << var << "\n" << endl;
    signal(sem);
}

void rndt(int& var) {
    int i;  
    wait(sem);
    var = random(10);
    cout << var << "\n" << endl;
    signal(sem);
    signal(sem);
}

void prt(){
    int sum;
    wait(sem);
    wait(sem);
    wait(sem);
    cout << var1 << "- 1 2 -  " << var2 << "\n" << endl;
    sum = var1 + var2;
    cout << sum << " - full sum" << endl;
}

main(){
    initialsem(sem, 2);
    cobegin {
        rndt(var1); rndo(var2); prt();
    }

    cout << "All processes finished" << endl;
}

【问题讨论】:

  • 将信号量初始化为 0 并移除 rndt 和 rndo 的等待。而且您不设置 var1 或 var2,只设置 var(不存在)。所以 rndt 和 rndo 应该只有调用信号,然后它应该工作。
  • 是的,现在可以了。我有点误解了这个想法,并期望使用 0 信号量不会执行任何操作。关于变量 - 我在 var1 和 var2 地址下写入值,所以这里没问题。
  • 如果你开始每一个进程都等待,那么你是正确的,如果信号量从 0 开始就不会发生任何事情。

标签: c++ mutex semaphore binary-semaphore


【解决方案1】:

如果打印机在工作人员等待之前设法等待两次,则会出现死锁: 打印机被困在第三次等待中,而工人在他们的第一次(唯一)等待中。

一个明显的解决方案是在值 0 处启动信号量,让打印机等待两次,然后让每个工作人员只做一次发布——每个人一次。

伪代码:

main:
    initialsem(sem,0);
    /*...*/

worker{1,2}:
    do_work();
    post();

printer:
    wait(); wait();
    do_print();

【讨论】:

  • 不知道为什么。但我在想,用 0 初始化的信号量,不允许执行任何进程。谢谢,它现在可以工作了:)
猜你喜欢
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 2019-06-05
相关资源
最近更新 更多