<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 功能強大 支持多語言、二開方便! 廣告
                在一些復雜的程序中,通常通過不同線程執行不同應用來實現程序的并發。當不同線程要使用同一個變量時,經常會出現一個問題:無法預知變量被不同線程修改的順序!(這通常被稱為資源競爭,指不同線程對同一變量使用的競爭)顯然這無法讓人容忍,那我們該如何解決這個問題呢? 經典的做法是一次只能讓一個線程對共享變量進行操作。當變量被一個線程改變時(臨界區),我們為它上鎖,直到這個線程執行完成并解鎖后,其他線程才能訪問它。 特別是我們之前章節學習的 map 類型是不存在鎖的機制來實現這種效果(出于對性能的考慮),所以 map 類型是非線程安全的.當并行訪問一個共享的 map 類型的數據,map 數據將會出錯。 在 Go 語言中這種鎖的機制是通過 sync 包中 Mutex 來實現的。sync 來源于 "synchronized" 一詞,這意味著線程將有序的對同一變量進行訪問。 `sync.Mutex`?是一個互斥鎖,它的作用是守護在臨界區入口來確保同一時間只能有一個線程進入臨界區。 假設 info 是一個需要上鎖的放在共享內存中的變量。通過包含?`Mutex`?來實現的一個典型例子如下: ~~~ import “sync” type Info struct { mu sync.Mutex // ... other fields, e.g.: Str string } ~~~ 如果一個函數想要改變這個變量可以這樣寫: ~~~ func Update(info *Info) { info.mu.Lock() // critical section: info.Str = // new value // end critical section info.mu.Unlock() } ~~~ 還有一個很有用的例子是通過 Mutex 來實現一個可以上鎖的共享緩沖器: ~~~ type SyncedBuffer struct { lock sync.Mutex buffer bytes.Buffer } ~~~ 在 sync 包中還有一個?`RWMutex`?鎖:他能通過?`RLock()`?來允許同一時間多個線程對變量進行讀操作,但是只能一個線程進行寫操作。如果使用?`Lock()`?將和普通的?`Mutex`?作用相同。包中還有一個方便的?`Once`?類型變量的方法`once.Do(call)`,這個方法確保被調用函數只能被調用一次。 相對簡單的情況下,通過使用 sync 包可以解決同一時間只能一個線程訪問變量或 map 類型數據的問題。如果這種方式導致程序明顯變慢或者引起其他問題,我們要重新思考來通過 goroutines 和 channels 來解決問題,這是在 Go 語言中所提倡用來實現并發的技術。我們將在第 14 章對其深入了解,并在第 14.7 節中對這兩種方式進行比較。
                  <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>

                              哎呀哎呀视频在线观看