1 回答
TA贡献1887条经验 获得超5个赞
不需要互斥体,因为单个集线器 goroutine是唯一访问映射的 goroutine。
另一种方法是消除 Go 例程和通道,并用使用互斥锁的函数替换它们。
type hub struct {
connections map[*connection]bool
mu sync.Mutex
}
var h = hub{
connections: make(map[*connection]bool),
}
func (h * hub) register(c *connection) {
h.mu.Lock()
h.connections[c] = true
}
func (h *hub) unregister(c *connection) {
h.mu.Lock()
if _, ok := h.connections[c]; ok {
delete(h.connections, c)
close(c.send)
}
h.mu.Unlock()
}
func (h * hub) broadcast(message []byte) {
h.mu.Lock()
for c := range h.connections {
select {
case c.send <- m:
default:
close(c.send)
delete(h.connections, c)
}
}
h.mu.Unlock()
}
保护close(c.send)和c.send <- m使用互斥锁很重要。这可以防止在关闭的通道上发送。
- 1 回答
- 0 关注
- 218 浏览
添加回答
举报