为了账号安全,请及时绑定邮箱和手机立即绑定

golang 中的 tls.Conn “goroutine 安全”吗?

golang 中的 tls.Conn “goroutine 安全”吗?

Go
慕森王 2021-11-01 15:11:35
我有一个问题:我可以在一个 goroutine 中tls.read tls 连接,而另一个 goroutine 正在调用tls.write吗?代码可能是这样的:func main() {        tlsConn := tls.Conn        go func() {                tlsConn.read(...)        }()        go func() {                tlsConn.write(...)        }()}
查看完整描述

2 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

输入和输出是分开的,所以它们不应该相互干扰。对Write或 的并发调用Read由互斥锁保护。

因此,是的,以并发方式调用它们是安全的。


查看完整回答
反对 回复 2021-11-01
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

tls 读写是相互独立的。


Read 和 Write 尊重地使用单独的互斥量输入和输出。


来自源代码的片段


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. 您可以同时进行多次写入,但一次只能进行一次写入。


查看完整回答
反对 回复 2021-11-01
  • 2 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信