英文:
is the tls.Conn "goroutine safe" in golang?
问题
我有一个问题:
在一个goroutine中,我可以同时使用tls.read读取tls连接,而另一个goroutine正在调用tls.write吗?
代码可能如下所示:
func main() {
tlsConn := tls.Conn
go func() {
tlsConn.read(...)
}()
go func() {
tlsConn.write(...)
}()
}
英文:
I have a question:
Can I tls.read a tls connection in one goroutine, while the other goroutine is calling tls.write?
the code may like this:
func main() {
tlsConn := tls.Conn
go func() {
tlsConn.read(...)
}()
go func() {
tlsConn.write(...)
}()
}
答案1
得分: 4
tls的读取和写入是相互独立的。
读取和写入分别使用不同的互斥锁。
源代码片段如下:
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 {
// 在 Handshake 之后放置此代码,以防止人们对 Read(nil) 进行调用以达到 Handshake 的副作用。
return
}
c.in.Lock()
defer c.in.Unlock()
.
.
}
因此:
-
您可以同时进行写入和读取操作。
-
您可以同时进行多个读取操作,但一次只能进行一次读取。
-
您可以同时进行多个写入操作,但一次只能进行一次写入。
英文:
tls Read and write are independent of each other.
Read and Write uses seperate mutex in and out respectedly.
Snippet from the source code
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()
.
.
}
Thus
-
You can write and read concurrently.
-
You can do multiple read concurrently but only one read will happen at a time.
-
You can do multiple write concurrently but only one write will happen at a time.
答案2
得分: 3
输入和输出是分离的,因此它们不应该相互干扰。对Write
或Read
的并发调用受到互斥锁的保护。
因此,是的,它们可以安全地以并发方式调用。
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论