Ошибка взаимоблокировки во взаимно параллельных процедурах Go

StackOverflow https://stackoverflow.com/questions/8351586

Вопрос

У меня есть три параллельные процедуры 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, ответить на ваш вопрос невозможно.

Если вам нужно обсудить код более подробно, вам, вероятно, следует опубликовать его на голанг-орехи.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top