首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解释一些Python代码

问解释一些Python代码
EN

Stack Overflow用户
提问于 2011-03-14 02:52:59
回答 1查看 728关注 0票数 2

这是一个屏障的基本示例,说明了一些线程如何等待进入一个入口的屏障和另一个出口的屏障。

虽然代码很好,但我并不是很深入地理解它是如何工作的……

例如,我不明白为什么一个线程在n= n-1之后进入n+1 ()函数,可以立即使n=n+1,从而影响全局n……?为什么看起来所有线程在使n= n-1停止后,都会在某个地方停止,然后使n= n+1同步?

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2011-03-14 03:19:48

n是仍需到达会合点的线程数。region是一个互斥锁,保护对n的访问。bar1和bar2是信号量,指示可以继续进行的线程数,初始化为0。

在barrier()的第一部分,每个线程依次进入,减少n,并阻塞bar1信号量。最后一个进入的线程(使n ==为0的线程)发布信号量threads时间,允许这么多的线程继续进行。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5291564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档