关于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,业务应该就直接报错了。(当然这样不太优雅)

0
0

深入Go底层原理,重写Redis中间件实战

深入Go语言原理+Go重写Redis

474 学习 · 172 问题

查看课程