我有一个问题: 我可以 tls.read 在一个goroutine中连接,而另一个goroutine是否正在调用 tls.write ? 代码可能是这样的:
func main() {
tlsConn := tls.Conn
go func() {
tlsConn.read(...)
}()
go func() {
tlsConn.write(...)
}()
}
答案 0 :(得分:3)
答案 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()
.
.
}
因此
您可以同时书写和阅读。
您可以同时进行多次读取,但一次只能进行一次读取。
您可以同时进行多次写入,但一次只能进行一次写入。