【发布时间】:2019-04-21 06:20:32
【问题描述】:
上图中是我需要提供解决方案的问题。这是我想出的解决方案(必须用 Go 编码)。我收到了死锁错误:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send]:
main.main()
/home/kypriank/Assignment 5/priorityqueue.go:42 +0x1a3
goroutine 17 [chan send]:
main.priorityQueue(0xc420080060, 0xc4200800c0)
/home/kypriank/Assignment 5/priorityqueue.go:22 +0x1a2
created by main.main
/home/kypriank/Assignment 5/priorityqueue.go:40 +0xe5
exit status 2
想知道是否有人可以帮助我找出我的代码出错的地方(主函数有一些代码来测试我的解决方案):
package main
var numOrder [20] int
var mesOrder [] PriorityMessage
var pri int
var a int
type PriorityMessage struct {
Priority int // between 0 and 9
Message string
}
func priorityQueue(west chan PriorityMessage, east chan string) {
incomming := <-west
if numOrder[incomming.Priority] == 10 {
numOrder[incomming.Priority] = incomming.Priority
}else {numOrder[incomming.Priority+1] = incomming.Priority}
mesOrder = append(mesOrder, incomming)
for i := 0; i < len(numOrder); i++ {if numOrder[i] != 10 {pri =
numOrder[i]; a = i; break}}
for i := 0; i < len(mesOrder); i++ {
if pri == mesOrder[i].Priority {
east <- (mesOrder[i]).Message
numOrder[a] = 10
mesOrder = append(mesOrder[:i], mesOrder[i+1:]...)
}
}
}
var west chan PriorityMessage
var east chan string
func printToScreen() {
for {println(<- east)}
}
func main() {
for i := 0; i < len(numOrder); i++ {numOrder[i] = 10}
west = make(chan PriorityMessage)
east = make(chan string)
go priorityQueue(west, east)
west <- PriorityMessage{1, "one"}
west <- PriorityMessage{0, "zero"}
west <- PriorityMessage{2, "two"}
west <- PriorityMessage{1, "another one"}
west <- PriorityMessage{0, "another zero"}
go printToScreen()
select {} // to allow all messages to be printed
}
【问题讨论】:
-
优先队列是CS中的标准数据类型,不需要并发来实现-en.wikipedia.org/wiki/Priority_queue#Usual_implementation
-
不幸的是,任务要求我使用并发来实现这一点。但是感谢您的输入 Dimitry :) 提供了大部分代码。我必须自己实现的唯一部分代码是 PriorityQueue 函数。
标签: go deadlock priority-queue channels