ioutil.Discard 这个 io.writer 是线程安全的吗

2018-02-19 17:39:19 +08:00
 admirez
2185 次点击
所在节点    Go 编程语言
18 条回复
inkedawn
2018-02-19 18:46:34 +08:00
文档没写就看源码呗

ioutil.Discard 对象本身没有保存什么信息,进去的东西都被丢弃了
rrfeng
2018-02-19 21:54:32 +08:00
丢弃的数据需要什么线程安全?
sdrzlyz
2018-02-19 22:15:23 +08:00
😳 假设楼主 writer 并发写的话,最终顺序是啥?
sagaxu
2018-02-19 22:18:47 +08:00
https://golang.org/src/io/ioutil/ioutil.go

从 122 行开始看,
type devNull int
var Discard io.Writer = devNull(0)

没有 data,何来 data race ?
admirez
2018-02-19 23:37:26 +08:00
@sagaxu 受教
zwh2698
2018-02-20 02:24:24 +08:00
就是 /dev/null
CRVV
2018-02-28 10:16:51 +08:00
@sagaxu
1. 没有 data 也可以有 race,data race 是 race condition 的子集
2. 这个事要从 144 行来看,ioutil.Discard 被专门做成了线程安全的
3. ioutil.Discard 曾经不是线程安全的,还被当案例写下来了。https://blog.golang.org/race-detector
sagaxu
2018-02-28 10:52:40 +08:00
@CRVV 在多线程并发上除了 data race 还有什么 race ?或者说软件开发上,还有别的导致不线程安全的 race?
CRVV
2018-02-28 11:39:27 +08:00
@sagaxu
文件的 close 和 open 之间可以有 race,这个和常见的 data race 是两回事

Node.js 里,如果写
console.log('exit')
process.exit()
前面的写操作是异步的,所以这两行之间有 race
sagaxu
2018-02-28 11:47:20 +08:00
@CRVV 串行执行的时候,你 close 掉文件再写入一样有问题,这已经不是 race 了,是 data dependency。
CRVV
2018-02-28 11:59:50 +08:00
@sagaxu
不是先 close 再 read 的问题
是 close 和 open 的问题
我指的是 https://github.com/golang/go/issues/7970
sagaxu
2018-02-28 12:11:26 +08:00
@CRVV 你举的先 close 再 open 例子就是典型的 data race
admirez
2018-02-28 12:43:39 +08:00
@CRVV 感谢,非常感谢
CRVV
2018-02-28 13:11:12 +08:00
@sagaxu
1. 我不知道你说的“典型的 data race ”是什么。
https://blog.regehr.org/archives/490 明确地给出了 data race 和 race condition 的定义和它们之前的关系
2. 我上面说 “ data race 是 race condition 的子集”,这是错的,这两个东西互相不是对方的子集
3. 按照我发的链接里的定义,不同线程上的 2 个 open 和 close 之间构不成 data race,因为只有 open 一个地方用到了内存地址
sagaxu
2018-02-28 16:22:29 +08:00
@CRVV

f.fd = -1 没有 happens-before close(fd),所以才引发了这个问题,在 Java Language Specification 里,这种因为 order 引发的错误,不管是代码写错还是编译器重排序引起,都称为 data race。

也有只把 data race 定义为 memory access 引发问题的,比如你给的那个博客。
CRVV
2018-02-28 18:37:18 +08:00
@sagaxu

https://docs.oracle.com/javase/specs/jls/se9/html/jls-17.html#jls-17.4.5
When a program contains two conflicting accesses (§17.4.1) that are not ordered by a happens-before relationship, it is said to contain a data race.

https://docs.oracle.com/javase/specs/jls/se9/html/jls-17.html#jls-17.4.1
Two accesses to (reads of or writes to) the same variable are said to be conflicting if at least one of the accesses is a write.

Java Language Specification 也把 data race 定义为 memory access
sagaxu
2018-02-28 20:28:40 +08:00
@CRVV 难道说这个 f.fd 不是共享的 instance field?

Table 17.4-B. Surprising results caused by statement reordering - valid compiler transformation

重排序引发的问题也当成 data race 的案例解释了
q397064399
2018-03-01 09:23:51 +08:00
@sagaxu #17 这里的重排 是值 CPU 乱序指令 执行吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/431241

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX