io.Pipe中的竞争条件?

时间:2015-12-03 10:19:21

标签: go io race-condition

我有一个函数返回Reader的{​​{1}}结尾并启动一个go-routine,它将数据写入io.Pipe端,然后关闭管道。

Writer

https://play.golang.org/p/OAijIwmtRr

这似乎总是在我的测试中起作用,因为我得到了我写的所有数据。但API docs对我来说有点担心:

  

func Pipe()(* PipeReader,* PipeWriter)

     

Pipe创建一个同步的内存中管道。 [...]一端读取是   与另一方的写作相匹配,[...]没有内部   缓冲。

     

func(w * PipeWriter)CloseWithError(错误错误)错误

     

CloseWithError关闭编写器;随后从读取的一半读取   管道将返回没有字节和错误错误,如果错误是,则返回EOF   为零。

我想知道的是,这里可能的竞争条件是什么?有可能我的go-routine会写一堆数据然后关闭管道然后才能读出来吗?

我是否需要使用通道来关闭何时关闭?什么可能出错,基本上。

1 个答案:

答案 0 :(得分:3)

不,没有竞争条件。正如文档中提到的那样,一端的读取与另一端的写入匹配。因此,当达到CloseWithError()时,表示每个Write已成功完成并与相应的Read匹配 - 因此另一端必须已阅读所有要阅读的内容。