Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c2a94a2

Browse files
committed
map 并发问题处理
1 parent 292a756 commit c2a94a2

File tree

1 file changed

+19
-10
lines changed
  • websites/code2/studygolang/src/logic

1 file changed

+19
-10
lines changed

websites/code2/studygolang/src/logic/book.go

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,27 @@ func (this *UserData) MessageQueue(serverId int) chan *Message {
5858
return this.serverMsgQueue[serverId]
5959
}
6060

61+
func (this *UserData) Remove(serverId int) {
62+
this.rwMutex.RLock()
63+
defer this.rwMutex.RUnlock()
64+
delete(this.serverMsgQueue, serverId)
65+
}
66+
6167
func (this *UserData) InitMessageQueue(serverId int) {
6268
this.rwMutex.Lock()
6369
defer this.rwMutex.Unlock()
6470
this.serverMsgQueue[serverId] = make(chan *Message, 1)
6571
}
6672

73+
func (this *UserData) SendMessage(message *Message) {
74+
this.rwMutex.Lock()
75+
defer this.rwMutex.Unlock()
76+
77+
for _, messageQueue := range this.serverMsgQueue {
78+
messageQueue <- message
79+
}
80+
}
81+
6782
var Book = &book{users: make(map[int]*UserData)}
6883

6984
type book struct {
@@ -115,7 +130,7 @@ func (this *book) DelUser(user, serverId int) {
115130
if this.users[user].Len() == 1 {
116131
delete(this.users, user)
117132
} else {
118-
delete(this.users[user].serverMsgQueue, serverId)
133+
this.users[user].Remove(serverId)
119134
}
120135
}
121136

@@ -140,19 +155,15 @@ func (this *book) Len() int {
140155
func (this *book) PostMessage(uid int, message *Message) {
141156
if userData, ok := this.users[uid]; ok {
142157
logger.Infoln("post message to", uid, message)
143-
for _, messageQueue := range userData.serverMsgQueue {
144-
messageQueue <- message
145-
}
158+
userData.SendMessage(message)
146159
}
147160
}
148161

149162
// 给所有用户广播消息
150163
func (this *book) BroadcastAllUsersMessage(message *Message) {
151164
logger.Infoln("BroadcastAllUsersMessage message", message)
152165
for _, userData := range this.users {
153-
for _, messageQueue := range userData.serverMsgQueue {
154-
messageQueue <- message
155-
}
166+
userData.SendMessage(message)
156167
}
157168
}
158169

@@ -163,9 +174,7 @@ func (this *book) BroadcastToOthersMessage(message *Message, myself int) {
163174
if uid == myself {
164175
continue
165176
}
166-
for _, messageQueue := range userData.serverMsgQueue {
167-
messageQueue <- message
168-
}
177+
userData.SendMessage(message)
169178
}
170179
}
171180

0 commit comments

Comments
 (0)