2017-08-31 11 views
3

golang src pipe.goを読んでパイプの仕組みを理解すると、私はこれらの2つのwrite()& read()関数を調べました。読者がread()funcを呼び出してl.lockを保持してからデータを待っていると、ライターはwrite()funcを呼び出してl.lockを取得してデータを書き込むのはどうですか?io.Pipe Write()およびRead()関数はどのように機能しますか?

func (p *pipe) write(b []byte) (n int, err error) { 
    // pipe uses nil to mean not available 
    if b == nil { 
     b = zero[:] 
    } 

    // One writer at a time. 
    p.wl.Lock() 
    defer p.wl.Unlock() 

    p.l.Lock() 
    defer p.l.Unlock() 
    if p.werr != nil { 
     err = ErrClosedPipe 
     return 
    } 
    p.data = b 
    p.rwait.Signal() 
    for { 
     if p.data == nil { 
      break 
     } 
     if p.rerr != nil { 
      err = p.rerr 
      break 
     } 
     if p.werr != nil { 
      err = ErrClosedPipe 
      break 
     } 
     p.wwait.Wait() 
    } 
    n = len(b) - len(p.data) 
    p.data = nil // in case of rerr or werr 
    return 
} 

読み:

func (p *pipe) read(b []byte) (n int, err error) { 

    // One reader at a time. 
    p.rl.Lock() 
    defer p.rl.Unlock() 

    p.l.Lock() 
    defer p.l.Unlock() 
    for { 
     if p.rerr != nil { 
      return 0, ErrClosedPipe 
     } 
     if p.data != nil { 
      break 
     } 
     if p.werr != nil { 
      return 0, p.werr 
     } 
     p.rwait.Wait() 
    } 
    n = copy(b, p.data) 
    p.data = p.data[n:] 
    if len(p.data) == 0 { 
     p.data = nil 
     p.wwait.Signal() 
    } 
    return 
} 
+1

私はsync.Condについてよく分かりませんが、 'p.rwait.L =&p.l'と' p.wwait.L =&p.l'は興味深いです。待っている/シグナルのペアが私には分かりません。 – captncraig

答えて

2

をミューテックスp.l読み出しに使用される、必要に応じてそれをロックし、ロックを解除しますsync.Cond条件を、書き込みされます。

条件にWaitをコールすると、ロックが解除され、対応するSignalコールを待機します。パイプでp.wwaitp.rwaitを使用して、ReadWriteのメソッド内のリーダーとライターを調整することがわかります。

+0

非常に良いキャッチ。私は最終的にこれに掘り下げるためにsync.Condが良いことを認識しました。 – captncraig

+2

@captncraig:そうですね、この正確なパイプコードの簡略化されたバージョンが、同期パッケージの良いCondの例になると思います。 – JimB

+0

ありがとう@JimB。私は、io.pipeを使ってオブジェクトをAWSにターリングしてストリーミングしようとしましたが、errデータが切り捨てられました。 io.pipeを使用してローカルファイルに出力する場合に機能します。なぜio.pipe write()funcは、データ漏れを起こさないリーダーがデータを消費するまでブロックされているのか分かりません。 – NSTNF

関連する問題