这是一个屏障的基本示例,说明了一些线程如何等待进入一个入口的屏障和另一个出口的屏障。
虽然代码很好,但我并不是很深入地理解它是如何工作的……
例如,我不明白为什么一个线程在n= n-1之后进入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()发布于 2011-03-14 03:19:48
n是仍需到达会合点的线程数。region是一个互斥锁,保护对n的访问。bar1和bar2是信号量,指示可以继续进行的线程数,初始化为0。
在barrier()的第一部分,每个线程依次进入,减少n,并阻塞bar1信号量。最后一个进入的线程(使n ==为0的线程)发布信号量threads时间,允许这么多的线程继续进行。
第二部分与第一部分是对称的,这一次等待最后一个线程增加n。
https://stackoverflow.com/questions/5291564
复制相似问题