Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Operating system 使用信号量实现N进程屏障_Operating System_Computer Science_Semaphore_Systems Programming_Barrier - Fatal编程技术网

Operating system 使用信号量实现N进程屏障

Operating system 使用信号量实现N进程屏障,operating-system,computer-science,semaphore,systems-programming,barrier,Operating System,Computer Science,Semaphore,Systems Programming,Barrier,我目前正在进行操作系统考试的培训,我遇到了以下问题: 实施“N流程壁垒”,即 是的,确保每个过程 一群人在某处等待 在其各自的执行中,例如 其他的过程,以达到他们的目标 给定点 你有以下几点 可供选择的老年退休金计划: init(sem,value)、wait(sem)和signal(sem) N是一个任意数。我可以使它适用于给定数量的进程,但不适用于任何数量的进程 有什么想法吗?可以用伪代码回答,这不是作业,只是个人学习。这在中有很好的介绍 使用N个信号量。不太确定 semaphore bar

我目前正在进行操作系统考试的培训,我遇到了以下问题:

实施“N流程壁垒”,即 是的,确保每个过程 一群人在某处等待 在其各自的执行中,例如 其他的过程,以达到他们的目标 给定点

你有以下几点 可供选择的老年退休金计划:

init(sem,value)、wait(sem)和signal(sem)

N是一个任意数。我可以使它适用于给定数量的进程,但不适用于任何数量的进程

有什么想法吗?可以用伪代码回答,这不是作业,只是个人学习。

这在中有很好的介绍


使用N个信号量。不太确定

semaphore barr[N]
semaphore excl=1
int count=0

int i=1
while (i<=N)
   barr[i]=0 #initialization
   i=i+1

# use, each thread (tid)
wait(excl)
count=count+1
if (count==N)
   int j=1
   while (j<=N)
       signal(barr[j])
       j=j+1
   count=0
signal(excl)
wait(barr[tid])
信号量barr[N]
信号量excl=1
整数计数=0
int i=1

而(i2个障碍信号灯,但不确定

semaphore barr[0..1] # two semaphores: barr[0] and barr[1]
semaphore excl=1
int count=0
int whichOne=0 # select semaphore to avoid race conditions

barr[0]=0 #initialization
barr[1]=0

# sample use
int current   #local for each thread
wait(excl)
current=whichOne
count=count+1
if (count==N)
   int j=1
   while (j<=N)
       signal(barr[current])
       j=j+1
   count=0
   whichOne=1-whichOne # swap barrier to avoid race conditions
signal(excl)
wait(barr[current])
信号量barr[0..1]#两个信号量:barr[0]和barr[1]
信号量excl=1
整数计数=0
int whichOne=0#选择信号量以避免竞争条件
barr[0]=0#初始化
巴尔[1]=0
#样本使用
每个线程的int current#local
等待(不包括)
电流=whichOne
计数=计数+1
如果(计数=N)
int j=1

虽然(jThanks!我想到了一个非常接近的方法。最好将
if count…
放在互斥块中,以确保它只被输入一次吗?从现在的情况看,你可能会输入两次。nvm-看了看这本小书,它可以被发送两次信号,因为这个屏障没有被重用,所以它是fi只要完成了目标,nal状态就无关紧要。举个例子:假设线程5获取互斥体,递增计数并释放互斥体。现在调度程序切换到另一个线程,该线程再次获取互斥体,递增计数并释放互斥体。计数现在为6,屏障将永远不会向其线程发出信号。Upvoted提供了一本关于信号灯的小书。太棒了!谢谢!这会遇到一个错误。应该是
while(i
semaphore barr[0..1] # two semaphores: barr[0] and barr[1]
semaphore excl=1
int count=0
int whichOne=0 # select semaphore to avoid race conditions

barr[0]=0 #initialization
barr[1]=0

# sample use
int current   #local for each thread
wait(excl)
current=whichOne
count=count+1
if (count==N)
   int j=1
   while (j<=N)
       signal(barr[current])
       j=j+1
   count=0
   whichOne=1-whichOne # swap barrier to avoid race conditions
signal(excl)
wait(barr[current])