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

How to synchronise 3 processes with one semaphore?

本文关键字:同步 进程 信号灯 何使用 一个      更新时间:2023-10-16

我收到了一项任务,将 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 开始信号量,让打印机等待两次,然后让每个工作人员只做一次发布 - 每次一次。

伪代码:

main:
initialsem(sem,0);
/*...*/
worker{1,2}:
do_work();
post();
printer:
wait(); wait();
do_print();