【发布时间】:2016-11-12 07:25:49
【问题描述】:
鉴于我有一部分用户类型的结构
Users := make([]User)
我正在监听 TCP 连接,当一个用户连接时,我正在向这个切片添加一个新用户。
我这样做的方法是设置一个 NewUsers 频道
NewUsers := make(chan User)
在新的 TCP 连接后,用户被发送到此通道,并且中心函数等待用户到达以将其添加到用户切片。
但现在我希望多个子系统(包/函数)使用此用户列表。一个函数可能只是想接收用户列表,而另一个函数可能想向每个用户广播消息,或者只是匹配某个条件的用户。
多个函数(可能从不同的 goroutine 执行)如何安全地访问用户列表。我看到了两种可能的方法:
- 需要访问此列表的每个子系统都需要自己的 AddUser 频道并维护自己的用户部分,并且需要将新用户广播到这些频道中的每一个。
- 使用互斥锁阻止访问
选项 1 似乎非常复杂,会产生相当多的重复,但我的理解是,如果您尝试坚持“通过通信共享内存”的口头禅,最好避免使用互斥锁。
【问题讨论】:
-
某人可能有不同的想法,但我认为如果您将目标视为共享用户,
Mutex(或RWLock,类似于互斥体,但允许多个并发读者)是自然映射到的。如果一个 goroutine 自然地“拥有”用户列表,那么通道可能更有意义,但正如所要求的那样,它会带锁。 -
@twotwotwo 很好的回答,谢谢。