gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:04:02 24 4
gpt4 key购买 nike

我收到了一项任务,要用一个信号量同步 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();

关于c++ - 如何用一个信号量同步 3 个进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59040521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com