import (
"fmt"
"runtime"
)
/*
结果:
有时99
有时100
*/
var counter_num int
const MAXSIZE = 100
func Count_num(ch chan int) {
counter_num++
ch <- 1
}
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
var chs [MAXSIZE] chan int
for i := 0; i < MAXSIZE; i++ {
chs[i] = make(chan int)
go Count_num(chs[i])
}
for _, ch := range chs {
<-ch
}
fmt.Println(counter_num)
}
这是我写的多个goroutine访问共享变量的代码,好像无法解决多goroutine同时访问共享变量的问题,网上也看到一个加锁的例子,但是好像听说go不需要加锁也可以解决这个问题.
牛人帮我看看。。。
package main
import (
"fmt"
"runtime"
"sync/atomic"
)
/*
结果:
有时99
有时100
*/
var counter_num uint32 = 0
const MAXSIZE = 100
func Count_num(ch chan uint32) {
atomic.AddUint32(&counter_num, 1)
ch <- counter_num
}
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
var chs [MAXSIZE]chan uint32
for i := 0; i < MAXSIZE; i++ {
chs[i] = make(chan uint32)
go Count_num(chs[i])
}
for i, ch := range chs {
print("-----", i, "\n")
print(<-ch, "\n")
}
fmt.Println(counter_num)
}
channel读写都是阻塞的,读的时候会一个个读,写也会一个个写。
play.golang http://play.golang.org/p/3OEXRguREM
package main
import "fmt"
func Count(ch chan int) {
ch <- 1
}
func main() {
chs := make([]chan int, 100)
for i := 0; i < 100; i++ {
chs[i] = make(chan int)
go Count(chs[i])
}
var sum int = 0
for _, ch := range chs {
sum += <-ch
}
fmt.Println(sum)
}