我在模拟考试中遇到了两个问题。我得到了答案,但无法弄清楚它们背后的原理。
我将首先发布代码,然后发布问题和答案。也许有人会这么好心地向我解释答案?
package main
import "fmt"
func fact(n int, c chan int, d chan int) {
k := /* code to compute factorial of n */
z := <- d
c <- k + z
d <- z + 1
}
func main() {
r := 0
c := make(chan int)
d := make(chan int)
for i = 0 ; i < N ; i++ {
go fact(i,c,d)
}
d <- 0
for j = 0 ; j < N ; j++ {
r = r + <-c
}
fmt.Printf("result = %d\n",r)
}
第一个问题是:
如果我们省略主程序中的“d <- 0”行,程序会怎样,为什么?
老师的回答是:
所有线程和主线程的状态都被阻塞。
第二个问题是:
如果交换fact过程的前两行,对整个程序的效率有什么影响?
答案是:
所有线程都将按顺序运行。每个线程只有在完成时才会触发另一个线程。
GCT1015
繁华开满天机
相关分类