解释一些Python代码
这是一个关于“屏障”的基本例子,展示了有些线程是如何在进入一个屏障时被等待的,以及在退出时又是如何被等待的。
虽然代码看起来没问题,但我其实不太明白它是怎么运作的……
比如,我不明白为什么一个进入 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()
1 个回答
2
n
表示还有多少个线程需要到达集合点。region
是一个互斥锁,用来保护对n
的访问。bar1
和bar2
是信号量,用来表示可以继续执行的线程数量,初始值为0。
在barrier()
的第一部分,每个线程依次进入,减少n
的值,并在bar1
信号量上阻塞。最后一个进入的线程(也就是把n
变成0的那个线程)会释放threads
次信号量,这样就允许那么多线程继续执行。
第二部分和第一部分是对称的,这次是等待最后一个线程来增加n
的值。