Ошибка взаимоблокировки во взаимно параллельных процедурах Go
-
27-10-2019 - |
Вопрос
У меня есть три параллельные процедуры go, как показано ниже,
func Routine1() {
mutex1.Lock()
do something
mutex2.Lock()
mutex3.Lock()
send int to routine 2
send int to routine 3
* Print Something *
mutex2.Unlock()
mutex3.Unlock()
receive ints
do something
mutex2.Lock()
mutex3.Lock()
send int to routine 2
send int to routine 3
Print Something
mutex2.Unlock()
mutex3.Unlock()
do something
receive ints
mutex1.Unlock()
wg.Done()
}
func Routine2() {
mutex2.Lock()
do something
mutex1.Lock()
mutex3.Lock()
send int to routine 1
send int to routine 3
Print Something
mutex1.Unlock()
mutex3.Unlock()
do something
receive ints
mutex1.Lock()
mutex3.Lock()
send int to routine 1
send int to routine 3
Print Something
mutex1.Unlock()
mutex3.Unlock()
do something
receive ints
mutex2.Unlock()
wg.Done()
}
func Routine3() {
// same structure as routine 1 & 2
}
func main() {
wg.Add(3)
go Routine1()
go Routine2()
Routine3()
wg.Wait()
}
Этот логический код каждый раз приводит к тупиковой ситуации.На самом деле, когда он запускается, просто выполняйте оператор печати процедуры 1 (оператор между знаками *) много раз (хотя мой оператор печати только один) и выдает ошибку взаимоблокировки.Кто-нибудь может сообщить мне, что не так с логикой кода.Спасибо.
ПРИМЕЧАНИЕ.Для получения дополнительной информации код можно найти здесь, http://play.golang.org/p/pW6aXryUaK, где выполняется только строка с номером 290.Исходный код, который не содержит ошибок, можно найти здесь play.golang.org/p/UL3rj8DJRk .Я просто добавляю к ним блокировку и разблокировку.Спасибо.
Я хочу добавить еще один момент:в коде play.golang.org/p/UL3rj8DJRk вы можете найти выходные данные различных операторов печати, подобных этому:процесс [номер] отправляет [int] процессу [номер] в [время в наносекундах].Однако, в результате трех параллельных процедур, иногда оператор print не выполняется должным образом (означает, что не печатается целиком, есть какая-то вещь, вставленная другой печатью, например, process [number] отправляет [int] процессу [number] в process [number]).Может ли какой - нибудь орган помочь мне , как справиться с этим ?
Решение
Невозможно определить причину взаимоблокировки, поскольку опубликованный вами код не содержит достаточного количества информации.
Это может быть вызвано порядком, в котором вы получаете блокировки, или это может быть вызвано использованием небуферизованных каналов Go.
Пока вы не опубликуете полный исходный код Go, ответить на ваш вопрос невозможно.
Если вам нужно обсудить код более подробно, вам, вероятно, следует опубликовать его на голанг-орехи.