关于EchoHandler在并发情况下的close问题
来源:11-4 实现EchoHandler(二)

weixin_慕神9322259
2024-04-01
老师你好,想问EchoHandler在并发情况下close应该不能保证所有的connection都关闭了吧?
func (handle *EchoHandler) Close() {
handle.closing.Store(true)
handle.activeMap.Range(func(key, value interface{}) bool {
client := key.(*EchoClient)
_ = client.Close()
return true
})
}
程序调用close方法时,先将handle.closing设置为true,然后遍历每个connection执行close,这有可能出现activeMap没有读取到最新的key的情况。考虑如下情况:
t0 < t1 < t2 < t3
t0 - 协程A 执行Handle方法,读取closing为false,准备进行后续handle业务
t1 - 协程B 调用Close方法,设置closing为true
t2 - 协程B 遍历activeMap的connection依次执行close,结束
t3 - 协程A 执行Handle业务, 将connection放入activeMap中。
感觉上述情况是可以发生,不清楚connection没有显示调用close会不会有什么影响?
写回答
1回答
-
Moody
2024-04-01
这样的话,go的进程应该就关掉了,后续新加的connection,业务应该就直接报错了。(当然这样不太优雅)
00
相似问题