Ошибка тупика во взаимно параллельных программах Go - PullRequest
0 голосов
/ 02 декабря 2011

У меня три одновременных подпрограммы, как показано ниже,

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 (оператор между * отметками) много раз (хотя мой оператор печати только один) и выдает ошибку взаимоблокировки. Кто-нибудь может сообщить мне, что не так с логикой кода. Спасибо.

NB. Для получения дополнительной информации код можно найти здесь, http://play.golang.org/p/pW6aXryUaK,, где выполняется только строка с номером 290. Оригинальный код, который не содержит ошибок, можно найти здесь play.golang.org/p/UL3rj8DJRk. Я просто добавляю блокировку и разблокирую их. Спасибо.

Я хочу добавить еще один момент: в коде play.golang.org/p/UL3rj8DJRk вы можете найти выходные данные различных операторов печати, например: процесс [число] отправляет [int] для обработки [номер ] в [время нано секунд]. Однако, в результате трех одновременных подпрограмм, иногда оператор print не выполняется должным образом (означает, что печать не целая, есть что-то, вставленное другим типом печати, например, процесс [число] отправляет [int] для обработки [число] в процессе [число] ]). Может ли кто-нибудь помочь мне с этим?

1 Ответ

1 голос
/ 02 декабря 2011

Невозможно определить причину тупика, потому что код, который вы разместили, не содержит достаточно информации.

Это может быть вызвано порядком, в котором вы получаете блокировки, или это может быть вызваноиспользование небуферизованных каналов Go.

Пока вы не опубликуете полный исходный код Go, ответить на ваш вопрос невозможно.

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

...