go 操作系统:文件方法的文档并发属性 ```markdown 操作系统:文件方法的文档并发属性 ```

dgenwo3n  于 9个月前  发布在  Go
关注(0)|答案(5)|浏览(130)

你正在使用的Go版本是什么( go version )?
https://pkg.go.dev/os@go1.19.1

这个问题在最新的版本中是否会重现?
是的。

你做了什么?
对于 #50436 ,我尝试在 os.Pipe 返回的文件上解除对读取的阻塞,同时它正被用户控制的goroutine并发读取。用户控制的goroutine可能合法地调用 Close 方法,并可能期望能够通过类型Assert访问其他方法(如 SetDeadline )。

你期望看到什么?
鉴于 #6270#7970#9307#17647https://go.dev/cl/65490 ,我期望 *os.File 的文档能描述哪些方法可以在并发执行的情况下安全调用,以及在什么条件下可以这样做。

你看到了什么?
我在 https://pkg.go.dev/os@go1.19.1 中找到的关于并发性的所有提及都说:
注意:文件上的最大并发操作数可能受到操作系统或系统的限制。这个数字应该很高,但超过它可能会降低性能或导致其他问题。
这似乎意味着至少有一些 File 方法可以并发执行,但没有明确说明哪些方法。
我在 Close 实现中在 unixplan9 上都看到了非同步写入(但也许 windows 不是这样?);对我来说,不清楚哪些其他方法是安全的,哪些不是。(CC @rsc@ianlancetaylor@robpike 来自之前的 *File 竞态条件。)

mctunoxg

mctunoxg1#

除非我们愿意在每个地方都放上锁,否则我不确定除了阅读操作系统的文档之外还能说些什么。

jslywgbw

jslywgbw2#

https://go.dev/cl/438347提到了这个问题:os: add test that concurrent calls to Close on a pipe are OK

htzpubme

htzpubme3#

实际上,除了Plan 9系统之外,我们已经拥有了所有常规文件或管道所需的锁。我已经将CL 438347发送给Plan 9以修复它。
我们拥有这些锁,因为我们无论如何都需要它们来运行时轮询器。
当前的例外情况是目录。对于目录和文件,有一个dirInfo字段。在访问该字段时没有锁定。

kadbb459

kadbb4594#

https://go.dev/cl/439195提到了这个问题:os/exec: remove protection against a duplicate Close on StdinPipe

fxnxkyjh

fxnxkyjh5#

https://go.dev/cl/439595提到了这个问题:os: ensure that concurrent I/O and Close on a pipe are OK

相关问题