<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                CAS算法(Compare And Swap),是原子操作的一種, CAS算法是一種有名的無鎖算法。無鎖編程,即不使用鎖的情況下實現多線程之間的變量同步,也就是在沒有線程被阻塞的情況下實現變量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)。可用于在多線程編程中實現不被打斷的數據交換操作,從而避免多線程同時改寫某一數據時由于執行順序不確定性以及中斷的不可預知性產生的數據不一致問題。 該操作通過將內存中的值與指定數據進行比較,當數值一樣時將內存中的數據替換為新的值。 Go中的CAS操作是借用了CPU提供的原子性指令來實現。CAS操作修改共享變量時候不需要對共享變量加鎖,而是通過類似樂觀鎖的方式進行檢查,本質還是不斷的占用CPU 資源換取加鎖帶來的開銷(比如上下文切換開銷)。 ~~~go package main import ( "fmt" "sync" "sync/atomic" ) var ( counter int32 //計數器 wg sync.WaitGroup //信號量 ) func main() { threadNum := 5 wg.Add(threadNum) for i := 0; i < threadNum; i++ { go incCounter(i) } wg.Wait() } func incCounter(index int) { defer wg.Done() spinNum := 0 for { // 原子操作 old := counter ok := atomic.CompareAndSwapInt32(&counter, old, old+1) if ok { break } else { spinNum++ } } fmt.Printf("thread,%d,spinnum,%d\n", index, spinNum) } ~~~ 當主函數main首先創建了5個信號量,然后開啟五個線程執行incCounter方法,incCounter內部執行, 使用cas操作遞增counter的值,`atomic.CompareAndSwapInt32`具有三個參數,第一個是變量的地址,第二個是變量當前值,第三個是要修改變量為多少,該函數如果發現傳遞的old值等于當前變量的值,則使用第三個變量替換變量的值并返回true,否則返回false。 這里之所以使用無限循環是因為在高并發下每個線程執行CAS并不是每次都成功,失敗了的線程需要重寫獲取變量當前的值,然后重新執行CAS操作。讀者可以把線程數改為10000或者更多就會發現輸出`thread,5329,spinnum,1`其中這個1就說明該線程嘗試了兩個CAS操作,第二次才成功。 因此呢, go中CAS操作可以有效的減少使用鎖所帶來的開銷,但是需要注意在高并發下這是使用cpu資源做交換的。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看