C 进程同步
1-过程AC 进程同步,c,process,synchronization,semaphore,C,Process,Synchronization,Semaphore,1-过程A write_semaphore -> 1 sem write_semaphore -> 1 sem counter_mutext -> 1 sem read[M] -> 0 // every element 0. (pseudocode) int counter = 0; 如何使用信号量进行同步?读取数据的最后一个进程B应该向写信号量发送信号,以便A进程写入下一个元素。如何知道每个B进程何时读取数据?使用计数信号量,如下所示: 处理循环(1个实例): 写数
write_semaphore -> 1
sem write_semaphore -> 1
sem counter_mutext -> 1
sem read[M] -> 0 // every element 0. (pseudocode)
int counter = 0;
如何使用信号量进行同步?读取数据的最后一个进程B应该向写信号量发送信号,以便A进程写入下一个元素。如何知道每个B进程何时读取数据?使用计数信号量,如下所示: 处理循环(1个实例):
让B等到A写完后再读,这是一个练习。:)您可以使用N个信号量(因为同一个B不能在a的单个迭代中读取两次);我不确定是否有更精简的方法。这是一个使用信号量数组的解决方案。我不确定它是否100%正确
// A process
i = 0
x = a[0];
// B processes
b[0] = x; // To ALL
// A process (I can continue now)
i = 1;
...
1-过程A
write_semaphore -> 1
sem write_semaphore -> 1
sem counter_mutext -> 1
sem read[M] -> 0 // every element 0. (pseudocode)
int counter = 0;
main(){
INTA[50],i;
对于(i=0;i<50;i++)
{
等待(写入信号量)
x=a[i];
对于(j=0;j
N-过程B
main(){
int a[50],i;
for (i = 0; i < 50; i++)
{
//wait(write_semaphore)
x = a[i];
}
}
main(){
int a[50],i;
for (i = 0; i < 50; i++)
{
wait(write_semaphore)
x = a[i];
for (j = 0; j < M; j++)
up(read[j]); //everyone can now read
}
}
main(){
int b[50],i;
int index;//数组中我的信号量的索引
对于(i=0;i<50;i++)
{
向下(读取[索引];//我阻塞,直到A向我发出信号
b[i]=x;
向下(计数器/互斥器);
计数器++;
if(counter==M)//每个人都读
up(write_信号量);
计数器=0;
向上(计数器/互斥器);
}
}
此解决方案要求每个B进程都知道其信号量数组的索引,这就是为什么我不确定它是否正确。上面的代码中没有共享变量
x
。在每个main()
函数中都有一个局部变量x
,但它们之间100%完全不相关,只是名称不一致。您需要为要共享的进程创建一些共享内存,然后为要使用的进程创建信号量——一个用于发送“x中的值就绪”,另一个用于发送“x中读取的值”的信号;下一个,我的错。不应在电源内部定义变量x。即使将x
设为全局变量,一个程序中的全局x
与另一个程序中的全局x
完全无关。您必须为要共享的变量创建共享内存。是的,假设它们存在。这更像是伪代码。。