V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
admirez
V2EX  ›  Go 编程语言

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

  •  
  •   admirez · 2018-02-19 17:39:19 +08:00 · 2200 次点击
    这是一个创建于 2494 天前的主题,其中的信息可能已经有所发展或是发生改变。
    18 条回复    2018-03-01 09:23:51 +08:00
    inkedawn
        1
    inkedawn  
       2018-02-19 18:46:34 +08:00
    文档没写就看源码呗

    ioutil.Discard 对象本身没有保存什么信息,进去的东西都被丢弃了
    rrfeng
        2
    rrfeng  
       2018-02-19 21:54:32 +08:00 via Android
    丢弃的数据需要什么线程安全?
    sdrzlyz
        3
    sdrzlyz  
       2018-02-19 22:15:23 +08:00 via Android
    😳 假设楼主 writer 并发写的话,最终顺序是啥?
    sagaxu
        4
    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
        5
    admirez  
    OP
       2018-02-19 23:37:26 +08:00
    @sagaxu 受教
    zwh2698
        6
    zwh2698  
       2018-02-20 02:24:24 +08:00 via Android
    就是 /dev/null
    CRVV
        7
    CRVV  
       2018-02-28 10:16:51 +08:00   ❤️ 1
    @sagaxu
    1. 没有 data 也可以有 race,data race 是 race condition 的子集
    2. 这个事要从 144 行来看,ioutil.Discard 被专门做成了线程安全的
    3. ioutil.Discard 曾经不是线程安全的,还被当案例写下来了。https://blog.golang.org/race-detector
    sagaxu
        8
    sagaxu  
       2018-02-28 10:52:40 +08:00 via Android
    @CRVV 在多线程并发上除了 data race 还有什么 race ?或者说软件开发上,还有别的导致不线程安全的 race?
    CRVV
        9
    CRVV  
       2018-02-28 11:39:27 +08:00 via Android
    @sagaxu
    文件的 close 和 open 之间可以有 race,这个和常见的 data race 是两回事

    Node.js 里,如果写
    console.log('exit')
    process.exit()
    前面的写操作是异步的,所以这两行之间有 race
    sagaxu
        10
    sagaxu  
       2018-02-28 11:47:20 +08:00 via Android
    @CRVV 串行执行的时候,你 close 掉文件再写入一样有问题,这已经不是 race 了,是 data dependency。
    CRVV
        11
    CRVV  
       2018-02-28 11:59:50 +08:00 via Android
    @sagaxu
    不是先 close 再 read 的问题
    是 close 和 open 的问题
    我指的是 https://github.com/golang/go/issues/7970
    sagaxu
        12
    sagaxu  
       2018-02-28 12:11:26 +08:00 via Android
    @CRVV 你举的先 close 再 open 例子就是典型的 data race
    admirez
        13
    admirez  
    OP
       2018-02-28 12:43:39 +08:00 via iPhone
    @CRVV 感谢,非常感谢
    CRVV
        14
    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
        15
    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
        16
    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
        17
    sagaxu  
       2018-02-28 20:28:40 +08:00 via Android
    @CRVV 难道说这个 f.fd 不是共享的 instance field?

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

    重排序引发的问题也当成 data race 的案例解释了
    q397064399
        18
    q397064399  
       2018-03-01 09:23:51 +08:00
    @sagaxu #17 这里的重排 是值 CPU 乱序指令 执行吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1009 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 22:20 · PVG 06:20 · LAX 14:20 · JFK 17:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.