Интересная проблема возникла сегодня, когда у меня есть код, который содержит более одного Mutex, каждый из которых блокирует блокировку для разных карт.гонка данных, сообщенная с двух различных взаимных обморожений
Вот похожи на структуры моего исходного кода, который я использую:
type MyStruct struct {
dogMutex sync.RWMutex
dogMap map[int]Dog // keyed by PID
catMutex sync.RWMutex
catMap map[int]Cat // keyed by (localAddress + localPort)
}
Более подробный пример вопроса здесь: https://play.golang.org/p/eic8q2VrNq
После создания исполняемого файла с ' go build -race ... "сгенерированный исполняемый файл сообщает о следующей гонке
Поскольку код более сложный, чем приведенный выше пример, что гонка данных сообщается в областях, указанных в коде.
Следующий стек из реального приложения.
1) записи операции сообщили о wwww.go: 95 эквивалентно мой WRITE комментарий в коде (метадона)
2) предыдущий прочитать operattion сообщил о wwww.go: 218 эквивалентный моя READ комментарий в коде (MethodTwo)
=================
WARNING: DATA RACE
Write at 0x00c420017890 by goroutine 97:
runtime.mapassign1()
/usr/local/go/src/runtime/hashmap.go:442 +0x0
main.(*NetworkManager).MethodOne()
/opt/doppler/src/xxx/yyy/wwww.go:95 +0x745
Previous read at 0x00c420017890 by goroutine 70:
runtime.mapiterinit()
/usr/local/go/src/runtime/hashmap.go:620 +0x0
main.NetworkManager.MethodTwo()
/opt/xxx/src/xxx/yyy/wwww.go:218 +0x1e9
main.(*NetworkManager).SomethingELse()
/opt/xxx/src/xxx/yyy/wwww.go:174 +0x99d
main.(*NetworkManager).SomethingFurther()
/opt/xxx/src/xxx/yyy/wwww.go:102 +0x3c
мне интересно, если это правильный способ использования семафоров. Мой код имеет много параллелизма, но я фокусирую этот вопрос на том факте, что детектор гонки сообщает на основе Apples vs Bananas (два совершенно разных мьютекса)
использование go версия go1.7 linux/amd64 – gextra
У меня такое чувство, что вы удалили гонку в упрощенном примере. Можете ли вы сделать что-то, что реплицирует гонку, или предоставить фактические методы и типы из вашего кода? – JimB
Код довольно взаимозависим. Это не помогло бы. Но, честно говоря, на самом деле нет никакой расы, за исключением того, что она сообщается. Вот почему я озадачен. – gextra