gpt4 book ai didi

algorithm - 1 位作者,M 位读者消费同一个项目

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:21:59 26 4
gpt4 key购买 nike

假设这个问题:2个程序,A和B,A的1个进程,M的M个进程,1个名为var的共享变量

A
main(){
int i, a[50];
for(i=0;i<50;i++)
var = a[i];
}



B
main(){
int i, b[50];
for(i=0;i<50;i++)
b[i] = var;
}

现在,我需要做的是确保对于 A 中的每个循环,M 个 B 进程中的每一个都读取共享变量(一次!)并将其存储在它们的数组中。所以最后每个 B 进程都会在它们的 b 数组中有一个 a 数组的副本。这是一个信号量问题,解决方案可以是伪代码,所以语言无关。

一个无效的初始解决方案:我正在使用一个初始化为 0 的信号量 B,每次 A 写东西时,我都会将 B 增加 M,然后执行 down(A)。在每个 B 循环的开始,我执行一个 down(B)。然后在 B 的每个循环结束时,我检查 M 读者是否读取并存储了 var,如果有,我正在执行 up(A)。

显然,上面的代码让单个 B 进程“消耗”了本应通过 M 读取器传播的所有 M 使用。那么我如何 - 聪明地 - 确保每个 B 只读取每个 var 一次?一组 M 个信号量(每个 M 一个)可以完成这项工作,但这很可能不是练习所要求的。

最佳答案

您可以使用四个信号量来完成此操作。一个意思是“A read an even location”。一个表示“B写了一个偶数位置”。一个意思是“A read an odd location”。最后一个意思是“B写了一个奇怪的位置”。

A 读取 a[0],然后发出第一个信号量 M 次,然后等待第二个信号量 M 次。 B 写入 b[0],然后向第二个信号量发出一次信号。

然后 A 读取 a[1],向第三个信号量发出信号 M 次,并等待第四个信号量 M 次。 B 写入 b[1] 并向第四个信号量发出一次信号。

然后在处理数组的奇数/偶数元素时在信号量之间切换。

很明显这是一个家庭作业问题,因为这看起来不像是一个现实的场景。

关于algorithm - 1 位作者,M 位读者消费同一个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14672438/

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