这是一个障碍的基本例子,一些线程如何等待进入入口的屏障和另一个出口屏障。
虽然代码很好,但我并不深入了解它是如何工作的......
例如,我不明白为什么进入barrier()函数的线程在n = n-1之后,可以立即使n = n + 1,从而影响全局n ...?为什么看起来所有的线程在他们使n = n-1停在某处之后,然后他们同步n = n + 1?
import threading
import time
import random
bar1= threading.Semaphore(value=0)
bar2= threading.Semaphore(value=0)
region= threading.Semaphore(value=1)
threads= 10
n= thread
threadlist= []
def usage(x):
for i in range(2):
print "[ENTER]: ",x
barrier()
print "[EXIT]: ",x
barrier()
def barrier():
global bar1,bar2, region,n,threads
region.acquire();
n = n - 1;
if n==0:
for i in range(threads):
bar1.release();
region.release();
bar1.acquire();
region.acquire()
n = n + 1
if n == threads:
for i in range(threads):
bar2.release()
region.release()
bar2.acquire()
random.seed()
for i in range(threads):
thread = threading.Thread(target=usage, args=(i,))
thread.start()
threadlist.append(thread)
for i in range(len(threadlist)):
threadlist[i].join()
答案 0 :(得分:2)
n
是仍然必须到达集合点的线程数。 region
是一个互斥锁,可以保护对n
的访问权限。 bar1
和bar2
是信号量,表示可以继续的线程数,初始化为0.
在barrier()
的第一部分中,每个主题轮流进入,减少n
,并阻塞bar1
信号量。要输入的最后一个线程(使n
== 0的那个)发布信号量threads
次,允许继续执行许多线程。
第二部分与第一部分对称,这次等待最后一个线程增加n
。