如何用一个信号量同步3个进程?

我已经收到一个任务,可以用一个信号量同步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;
}
wssfeng8287 回答:如何用一个信号量同步3个进程?

如果打印机设法在工作人员等待之前等待两次,则可能导致死锁: 打印机在第三次等待中卡住,而工人在第一次(仅)等待中。

一个明显的解决方案是将信号量从值0开始,让打印机等待两次,让每个工作人员只能执行发布操作,而每次只能执行一次。

伪代码:

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

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

printer:
    wait(); wait();
    do_print();
本文链接:https://www.f2er.com/3033187.html

大家都在问