代码如下:
```go
package main
import (
"fmt"
"runtime"
)
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
c := make(chan bool, 10)
for i := 0; i < 10; i++ {
go Go(c, i)
}
for i := 0; i < 10; i++ { //如何使用`for-range`循环实现?
<-c
}
}
func Go(c chan bool, index int) {
a := 0
for i := 0; i < 10000000; i++ {
a += i
}
fmt.Println(index, a)
c <- true
}
```
求解。
看了下你的代码,我觉得你的代码的意图是,创建一个bool的chan 每个线程结束通知这个通道。 然后再通过遍历这个通道来达到等待所有线程都执行结束的目的。
但是完全不需要用到通道。直接用WaitGroup就行了。
不知道你是否这个意图。至少你代码展现是这个意图。
以下使用WaitGroup的例子。
package main
import (
"fmt"
"sync"
)
func main() {
//如果想用和cpu同等数量的线程,这句根本不需要,go默认就是。
//runtime.GOMAXPROCS(runtime.NumCPU())
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go Go(&wg, i)
}
wg.Wait()
}
func Go(wg *sync.WaitGroup, index int) {
//defer 的作用不单单是结束才运行,它是保证函数出错了也运行的机制。
//但对性能有影响,如果这函数永远不会发生运行时错误,最好加到末尾。
defer wg.Done()
a := 0
for i := 0; i < 10000000; i++ {
a += i
}
fmt.Println(index, a)
//wg.Done()
}
#9
更多评论
package main
import (
"fmt"
"runtime"
)
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
cs := make([]chan bool, 10)
for i := 0; i < 10; i++ {
cs[i] = make(chan bool, 1)
go Go(cs[i], i)
}
for _, c := range cs {
<-c
}
}
func Go(c chan bool, index int) {
a := 0
for i := 0; i < 10000000; i++ {
a += i
}
fmt.Println(index, a)
c <- true
}
改成slice试试?
#2