0

この Web サイト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

余分な努力のすべてを理解していません。みんな、ありがとう。

4

1 に答える 1

0

この例の余分な作業は、循環バリアの動作に関連付けられた状態を維持するためです (すべての待機中のスレッドが解放された後に再利用できます)。

あなたの単純化では、2つの問題があると思います.再利用できず、偽のウェイクアップに対して待機呼び出しを保護していません:

  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()
于 2015-01-13T21:46:33.187 に答える