是tls.Conn" goroutine safe"在golang?

时间:2015-08-14 10:16:11

标签: ssl go

我有一个问题: 我可以 tls.read 在一个goroutine中连接,而另一个goroutine是否正在调用 tls.write ? 代码可能是这样的:

func main() {
        tlsConn := tls.Conn
        go func() {
                tlsConn.read(...)
        }()
        go func() {
                tlsConn.write(...)
        }()
}

2 个答案:

答案 0 :(得分:3)

输入和输出为separated,因此不应干扰。对WriteRead的并发调用由互斥锁保护。

因此,是的,可以安全地同时调用它们。

答案 1 :(得分:3)

读取和写入彼此独立。

读取和写入使用单独的互斥锁进出。

源代码中的代码段

func (c *Conn) Write(b []byte) (int, error) {
    if err := c.Handshake(); err != nil {
        return 0, err
    }

    c.out.Lock()
    defer c.out.Unlock()
    .
    .
}

func (c *Conn) Read(b []byte) (int, error) {
    if err := c.Handshake(); err != nil {
        return 0, err
    }

    if len(b) == 0 {
    // Put this after Handshake, in case people were calling
    // Read(nil) for the side effect of the Handshake.
    return
    }

    c.in.Lock()
    defer c.in.Unlock()
    .
    .
}

因此

  1. 您可以同时书写和阅读。

  2. 您可以同时进行多次读取,但一次只能进行一次读取。

  3. 您可以同时进行多次写入,但一次只能进行一次写入。