解释一些Python代码

2 投票
1 回答
775 浏览
提问于 2025-04-16 13:37

这是一个关于“屏障”的基本例子,展示了有些线程是如何在进入一个屏障时被等待的,以及在退出时又是如何被等待的。
虽然代码看起来没问题,但我其实不太明白它是怎么运作的……
比如,我不明白为什么一个进入 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的访问。bar1bar2是信号量,用来表示可以继续执行的线程数量,初始值为0。

barrier()的第一部分,每个线程依次进入,减少n的值,并在bar1信号量上阻塞。最后一个进入的线程(也就是把n变成0的那个线程)会释放threads次信号量,这样就允许那么多线程继续执行。

第二部分和第一部分是对称的,这次是等待最后一个线程来增加n的值。

撰写回答