在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ GO/ Go互斥體實(shí)例
Go panic錯(cuò)誤處理實(shí)例
Go命令行參數(shù)實(shí)例
Go可變參數(shù)的函數(shù)實(shí)例
Go通道同步實(shí)例
Go非阻塞通道操作實(shí)例
Go指針實(shí)例
Go數(shù)字解析實(shí)例
Go語(yǔ)言指針
Go超時(shí)(timeouts)實(shí)例
Go速率限制實(shí)例
Go信號(hào)實(shí)例
Go Base64編碼實(shí)例
Go計(jì)時(shí)器實(shí)例
Go命令行標(biāo)志實(shí)例
Go原子計(jì)數(shù)器實(shí)例
Go語(yǔ)言切片
Go隨機(jī)數(shù)實(shí)例
Go語(yǔ)言類型轉(zhuǎn)換
Go排序?qū)嵗?/span>
Go時(shí)間格式化/解析實(shí)例
Go URL解析實(shí)例
Go字符串函數(shù)實(shí)例
Go語(yǔ)言常量
Go for循環(huán)語(yǔ)句實(shí)例
Go函數(shù)多個(gè)返回值實(shí)例
Go切片實(shí)例
Go行過(guò)濾器實(shí)例
Go語(yǔ)言接口
Go語(yǔ)言數(shù)組
Go語(yǔ)言變量
Go字符串格式化實(shí)例
Go斷續(xù)器實(shí)例
Go if/else語(yǔ)句實(shí)例
Go通道緩沖實(shí)例
Go錯(cuò)誤實(shí)例
Go語(yǔ)言映射
Go執(zhí)行過(guò)程實(shí)例
Go函數(shù)實(shí)例
Go有狀態(tài)的goroutines實(shí)例
Go按自定義函數(shù)排序?qū)嵗?/span>
Go語(yǔ)言作用域規(guī)則
Go時(shí)代(Epoch)實(shí)例
Go變量實(shí)例
Go互斥體實(shí)例
Go語(yǔ)言范圍(range)
Go程序?qū)嵗?/span>
Go語(yǔ)言入門
Go通道路線實(shí)例
Go閉包(匿名函數(shù))實(shí)例
Go Select實(shí)例
Go通道范圍實(shí)例
Go集合函數(shù)實(shí)例
Hello World程序?qū)嵗?/span>
Go環(huán)境變量實(shí)例
Go語(yǔ)言運(yùn)算符
Go讀取文件實(shí)例
Go延遲(defer)實(shí)例
Go SHA1哈希實(shí)例
Go語(yǔ)言條件和決策
Go語(yǔ)言錯(cuò)誤處理
Go通道實(shí)例
Go指針實(shí)例
Go時(shí)間日期實(shí)例
Go語(yǔ)言字符串
Go語(yǔ)言循環(huán)
Go語(yǔ)言基礎(chǔ)語(yǔ)法
Go語(yǔ)言開(kāi)發(fā)環(huán)境安裝配置
Go常量實(shí)例
Go語(yǔ)言結(jié)構(gòu)體
Go寫文件實(shí)例
Go正則表達(dá)式實(shí)例
Go JSON實(shí)例
Go語(yǔ)言教程
Go關(guān)閉通道實(shí)例
Go接口實(shí)例
Go語(yǔ)言遞歸
Go switch語(yǔ)句實(shí)例
Go函數(shù)遞歸實(shí)例
Go退出程序?qū)嵗?/span>
Go語(yǔ)言程序結(jié)構(gòu)
Go范圍實(shí)例
Go語(yǔ)言函數(shù)
Go工作池實(shí)例
Go語(yǔ)言數(shù)據(jù)類型

Go互斥體實(shí)例

在前面的例子中,我們看到了如何使用原子操作來(lái)管理簡(jiǎn)單的計(jì)數(shù)器狀態(tài)。對(duì)于更復(fù)雜的狀態(tài),可以使用互斥體來(lái)安全地訪問(wèn)多個(gè)goroutine中的數(shù)據(jù)。

在這個(gè)例子中,狀態(tài)(state)是一個(gè)映射。
示例中的互斥將同步訪問(wèn)狀態(tài)。

我們將跟蹤執(zhí)行的讀寫操作的數(shù)量。

這里將啟動(dòng)100個(gè)goroutine來(lái)對(duì)狀態(tài)執(zhí)行重復(fù)讀取,每個(gè)goroutine中每毫秒讀取一次。

對(duì)于每個(gè)讀取,我們選擇一個(gè)鍵來(lái)訪問(wèn),Lock()互斥體以確保對(duì)狀態(tài)的獨(dú)占訪問(wèn),讀取所選鍵的值,Unlock()互斥體,并增加readOps計(jì)數(shù)。

我們還將啟動(dòng)10個(gè)goroutine來(lái)模擬寫入,使用與讀取相同的模式。

10個(gè)goroutine在狀態(tài)和互斥體上工作一秒鐘。采集和報(bào)告最終操作計(jì)數(shù)。

收集和報(bào)告最終操作計(jì)數(shù)。用最后的鎖狀態(tài),顯示它是如何結(jié)束的。

運(yùn)行程序顯示,我們對(duì)互斥同步狀態(tài)執(zhí)行了大約90,000次的操作。

所有的示例代碼,都放在 F:\worksp\golang 目錄下。安裝Go編程環(huán)境請(qǐng)參考:http://www.yiibai.com/go/go_environment.html

mutexes.go的完整代碼如下所示 -

package main

import (
    "fmt"
    "math/rand"
    "sync"
    "sync/atomic"
    "time"
)

func main() {

    // For our example the `state` will be a map.
    var state = make(map[int]int)

    // This `mutex` will synchronize access to `state`.
    var mutex = &sync.Mutex{}

    // We'll keep track of how many read and write
    // operations we do.
    var readOps uint64 = 0
    var writeOps uint64 = 0

    // Here we start 100 goroutines to execute repeated
    // reads against the state, once per millisecond in
    // each goroutine.
    for r := 0; r < 100; r++ {
        go func() {
            total := 0
            for {

                // For each read we pick a key to access,
                // `Lock()` the `mutex` to ensure
                // exclusive access to the `state`, read
                // the value at the chosen key,
                // `Unlock()` the mutex, and increment
                // the `readOps` count.
                key := rand.Intn(5)
                mutex.Lock()
                total += state[key]
                mutex.Unlock()
                atomic.AddUint64(&readOps, 1)

                // Wait a bit between reads.
                time.Sleep(time.Millisecond)
            }
        }()
    }

    // We'll also start 10 goroutines to simulate writes,
    // using the same pattern we did for reads.
    for w := 0; w < 10; w++ {
        go func() {
            for {
                key := rand.Intn(5)
                val := rand.Intn(100)
                mutex.Lock()
                state[key] = val
                mutex.Unlock()
                atomic.AddUint64(&writeOps, 1)
                time.Sleep(time.Millisecond)
            }
        }()
    }

    // Let the 10 goroutines work on the `state` and
    // `mutex` for a second.
    time.Sleep(time.Second)

    // Take and report final operation counts.
    readOpsFinal := atomic.LoadUint64(&readOps)
    fmt.Println("readOps:", readOpsFinal)
    writeOpsFinal := atomic.LoadUint64(&writeOps)
    fmt.Println("writeOps:", writeOpsFinal)

    // With a final lock of `state`, show how it ended up.
    mutex.Lock()
    fmt.Println("state:", state)
    mutex.Unlock()
}

執(zhí)行上面代碼,將得到以下輸出結(jié)果 -

F:\worksp\golang>go run mutexes.go
readOps: 84546
writeOps: 8473
state: map[0:99 3:3 4:62 1:18 2:89]