Go併發程式設計之美 Load Store操作

2022-09-23 18:39:09 字數 970 閱讀 8856

一、前言 go語言類似j**a juc包也提供了一些列用於多執行緒之間進行同步的措施,比如低階的同步措施有 鎖、cas、原子變數操作類。相比j**a來說go提供了獨特的基於通道的同步措施。本節我們先來看看go中load/store操作 二、load/store操作 go中的load和store提供了原子性的讀取和修改變數的功能,那麼什麼是原子性那?比如int64 型別的變數m,在位元組長為32的計算機中,讀取該變數m需要兩次讀取(比如先讀取高32位,然後在讀取底32位),寫入的時候也是一樣。

go語言類似j**a juc包也提供了一些列用於多執行緒之間進行同步的措施,比如低階的同步措施有 鎖、cas、原子變數操作類。相比j**a來說go提供了獨特的基於通道的同步措施。本節我們先來看看go中load/store操作

go中的load和store提供了原子性的讀取和修改變數的功能,那麼什麼是原子性那?比如int64 型別的變數m,在位元組長為32的計算機中,讀取該變數m需要兩次讀取(比如先讀取高32位,然後在讀取底32位),寫入的時候也是一樣。正常情況下讀取變數m的時候並沒有加什麼額外的措施,多個執行緒可以同時讀寫該變數的高32和底32位。

比如執行緒a讀取變數m的高32時候,執行緒b在修改變數m的低32位,那麼就會造成執行緒a讀取的變數的m的高32位是原來的值,低32位是執行緒b修改後的值,從而導致髒資料,程式出錯。

go中的atomic.loadint64(&m)操作可以保證在讀取變數m的時候,其他執行緒不能修改變數m,atomic.storeint64(&m, val)操作則可以保證在修改變數的高低位時候其他執行緒不能讀取該變數。

其實前面<>一文中使用cas實現的計數器本身還是有問題的:

其中2.1old := counter處可能獲取髒資料,此處應該修改為

old := atomic.loadint32(&counter)

go中的load和store操作提供了對變數原子性的操作,可以避免當型別長度大於計算機位元組長時候多執行緒讀寫變數造成資料混亂,在j**a中變數宣告為volatile可以避免該問題。

Go併發程式設計之美之條件變數

一 前言 go語言類似j a juc包也提供了一些列用於多執行緒之間進行同步的措施,比如低階的同步措施有 鎖 cas 原子變數操作類。相比j a來說go提供了獨特的基於通道的同步措施。本節我們先來看看go中與鎖相關的條件變數 二 條件變數 在j a中條件變數是與具體的鎖想關聯的,在go中也是這樣的。...

Go併發程式設計之美之互斥鎖

一 前言 go語言類似j a juc包也提供了一些列用於多執行緒之間進行同步的措施,比如低階的同步措施有 鎖 cas 原子變數操作類。相比j a來說go提供了獨特的基於通道的同步措施。本節我們先來看看go中互斥鎖 二 互斥鎖 互斥鎖是獨佔鎖,同時只有乙個執行緒可以獲取該鎖,其他執行緒則會被阻塞掛起,...

Go併發程式設計之CAS操作

一 前言 go語言類似j a juc包也提供了一些列用於多執行緒之間進行同步的措施,比如低階的同步措施有 鎖 cas 原子變數操作類。相比j a來說go提供了獨特的基於通道的同步措施。我們先來看看go中cas操作 二 cas操作 go中的cas操作與j a中類似,都是借用了cpu提供的原子性指令來實...