我试着读取mgo的代码,并且socket.go中的函数SimpleQuery让我困惑。在这个功能中,有两个地方互斥: https://github.com/go-mgo/mgo/blob/v2-unstable/socket.go本地互斥在SimpleQuery中的socket.go
func (socket *mongoSocket) SimpleQuery(op *queryOp) (data []byte, err error) {
var wait, change sync.Mutex
var replyDone bool
var replyData []byte
var replyErr error
wait.Lock()
op.replyFunc = func(err error, reply *replyOp, docNum int, docData []byte) {
change.Lock()
if !replyDone {
replyDone = true
replyErr = err
if err == nil {
replyData = docData
}
}
change.Unlock()
wait.Unlock()
}
err = socket.Query(op)
if err != nil {
return nil, err
}
wait.Lock()
change.Lock()
data = replyData
err = replyErr
change.Unlock()
return data, err
}
至于我的理解,对于每一个电话,就会有一个新的地方互斥体,因此,它实际上是保护什么,他们为什么把互斥吗?