У меня три одновременных подпрограммы, как показано ниже,
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] для обработки [число] в процессе [число] ]). Может ли кто-нибудь помочь мне с этим?