你正在使用的Go版本是什么( go version
)?
https://pkg.go.dev/os@go1.19.1
这个问题在最新的版本中是否会重现?
是的。
你做了什么?
对于 #50436 ,我尝试在 os.Pipe
返回的文件上解除对读取的阻塞,同时它正被用户控制的goroutine并发读取。用户控制的goroutine可能合法地调用 Close
方法,并可能期望能够通过类型Assert访问其他方法(如 SetDeadline
)。
你期望看到什么?
鉴于 #6270 、 #7970 、 #9307 、 #17647 和 https://go.dev/cl/65490 ,我期望 *os.File
的文档能描述哪些方法可以在并发执行的情况下安全调用,以及在什么条件下可以这样做。
你看到了什么?
我在 https://pkg.go.dev/os@go1.19.1 中找到的关于并发性的所有提及都说:
注意:文件上的最大并发操作数可能受到操作系统或系统的限制。这个数字应该很高,但超过它可能会降低性能或导致其他问题。
这似乎意味着至少有一些 File
方法可以并发执行,但没有明确说明哪些方法。
我在 Close
实现中在 unix
和 plan9
上都看到了非同步写入(但也许 windows
不是这样?);对我来说,不清楚哪些其他方法是安全的,哪些不是。(CC @rsc@ianlancetaylor@robpike 来自之前的 *File
竞态条件。)
5条答案
按热度按时间mctunoxg1#
除非我们愿意在每个地方都放上锁,否则我不确定除了阅读操作系统的文档之外还能说些什么。
jslywgbw2#
https://go.dev/cl/438347提到了这个问题:
os: add test that concurrent calls to Close on a pipe are OK
htzpubme3#
实际上,除了Plan 9系统之外,我们已经拥有了所有常规文件或管道所需的锁。我已经将CL 438347发送给Plan 9以修复它。
我们拥有这些锁,因为我们无论如何都需要它们来运行时轮询器。
当前的例外情况是目录。对于目录和文件,有一个
dirInfo
字段。在访问该字段时没有锁定。kadbb4594#
https://go.dev/cl/439195提到了这个问题:
os/exec: remove protection against a duplicate Close on StdinPipe
fxnxkyjh5#
https://go.dev/cl/439595提到了这个问题:
os: ensure that concurrent I/O and Close on a pipe are OK