// 多线程 编译时建议带上参数-race,可以帮助检测函数中是否有锁竞争 go build -race xx/xxx/xxx/main
var ( m = make(map[int]int) lock sync.Mutex )
func calc(c int) { num := 1 for i := 1; i < c; i++ { num *= i }
lock.Lock() m[c] = num lock.Unlock() }
func main() { for i := 0; i < 10; i++ { go calc(i) } time.Sleep(time.Second) lock.Lock() for k, v := range m { fmt.Printf("k:%v,v:%v\n", k, v) } lock.Unlock() }
func initData(c chan int) { for i := 0; i < 10000; i++ { c <- i } close(c) }
func calc(takeChan chan int, result chan int, exit chan bool) { flag := true for v := range takeChan {
for i := 2; i < v; i++ { if v%i == 0 { flag = false break } } if flag { result <- v } flag = true } exit <- true fmt.Println("exit-----------------------------------------------------") }
func read(result chan int) { for v := range result { fmt.Println("result:", v) } }
func main() { var intChan chan int var resultChan chan int var exitChan chan bool intChan = make(chan int, 1000) resultChan = make(chan int, 1000) exitChan = make(chan bool, runtime.NumCPU()) go initData(intChan) for i := 0; i < runtime.NumCPU(); i++ { go calc(intChan, resultChan, exitChan) go read(resultChan) } for i := 0; i < runtime.NumCPU(); i++ { fmt.Printf("**************************wait goroute:%d************************\n", i) <-exitChan } close(resultChan) close(exitChan) }
func main() { var c chan int c = make(chan int, 10) for i := 0; i < 10; i++ { c <- i }
close(c) for { v, ok := <-c if ok == false { fmt.Println("channel is colse!") break } fmt.Println(v) } }
```
### select关键字的使用:
func main() { var ch chan int var ch2 chan int ch = make(chan int, 10) ch2 = make(chan int, 10) go func() { for i := 0; i < 10; i++ { ch <- i ch2 <- i * i time.Sleep(time.Second) } }()
for {
select {
case v := <-ch:
fmt.Println(v)
case v := <-ch2:
fmt.Println(v)
default:
fmt.Println("get data timeout")
time.Sleep(time.Second)
}
}