实施同步障碍

时间:2015-01-11 23:43:57

标签: multithreading synchronization deadlock barrier

在这个网站http://www.cs.cornell.edu/courses/cs4410/2010fa/synchreview.pdf上,它表示必须以下列方式实现多次迭代的屏障:

class Barrier:
    def __init__(self, N):
        self.incount = 0
        self.outcount = 0
        self.N = N
        self.lock = Lock()
        self.everyoneatbarrier = Condition(self.lock)

    def barrier(self, processid):
        with self.lock:
            self.incount += 1
            if self.incount == self.N
                self.everoneatbarrier.notifyAll()
            while self.incount < self.N or 
                (self.incount >= self.N and self.outcount < self.N):
                self.everyoneatbarrier.wait()
            self.outcount += 1
            if self.outcount == self.N:
                self.outcount = 0
                self.incount ­= self.N
如果我们只使用一个简单的if-else语句,那么它会不会更简单:

    def barrier(self, processid):
        with self.lock:
            self.count += 1
            if self.count == self.N :
                self.everyoneatbarrier.notifyAll()
            else :
                self.everyoneatbarrier.wait()
            self.count = 0

我不理解所有额外的努力。谢谢大家。

1 个答案:

答案 0 :(得分:0)

示例中的额外工作是由于将相关状态维持在循环障碍的行为(它可以在释放所有等待线程后重用)。

在你的简化中,我认为有两个问题,它不可重复使用,你不能保护等待来免受虚假唤醒:

  def barrier(self, processid):
    with self.lock:
        self.count += 1
        if self.count == self.N :
            self.everyoneatbarrier.notifyAll()
        else :
            while self.count < N:
                self.everyoneatbarrier.wait()