zoukankan      html  css  js  c++  java
  • 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)
    }
  • 相关阅读:
    python基础五——初识函数
    python基础三——基础数据类型
    Python基础二
    python基础一
    2.配置jenkins
    1.jenkins 安装
    Java8 新特性
    Java8 新特性
    1.什么是 Docker
    idea快捷键
  • 原文地址:https://www.cnblogs.com/xiongying4/p/12037316.html
Copyright © 2011-2022 走看看