Select与Mutex

什么是Select

select 语句用于在多个发送/接收信道操作中进行选择。select 语句会一直阻塞,直到发送/接收操作准备就绪。如果有多个信道操作准备完毕,select 会随机地选取其中之一执行。该语法与 switch 类似,所不同的是,这里的每个 case 语句都是信道操作。

package main

import (
    "fmt"
    "time"
)

func test5(a chan int) {
    time.Sleep(time.Second*3)
    a <- 1
}
func test6(b chan int) {
    time.Sleep(time.Second*5)
    b <- 1
}

func main(){
    a := make(chan int)
    b := make(chan int)
    go test5(a)
    go test6(b)
    for{  //使用for循环
        select{
        case <-a:
            fmt.Println("test5执行完毕")
            return  // 执行完毕返回
        case <-b: fmt.Println("test6执行完毕")
            return
        default:
            fmt.Println("没有一个完成")
        }
    }


}

什么是Mutex

使用mutex

Mutex 用于提供一种加锁机制(Locking Mechanism),可确保在某时刻只有一个协程在临界区运行,以防止出现竞态条件。

Mutex 可以在 [sync] 包内找到。[Mutex] 定义了两个方法:[Lock]和 [Unlock](。所有在 Lock 和 Unlock 之间的代码,都只能由一个 Go 协程执行,于是就可以避免竞态条件。

package main

import (
    "fmt"
    "sync"
)

var x  = 0
func increment(wg *sync.WaitGroup,m *sync.Mutex) {
    m.Lock()
    x = x + 1
    m.Unlock()
    wg.Done()
}
func main() {
    var w sync.WaitGroup
    var m sync.Mutex   //值类型,传递地址
    for i := 0; i < 1000; i++ {
        w.Add(1)
        go increment(&w,&m)
    }
    w.Wait()
    fmt.Println("final value of x", x)
}
posted @ 2019-12-13 21:15  小青年て  阅读(154)  评论(0编辑  收藏  举报