<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                當兩個或更多的操作必須以正確的順序執行時,就會出現競爭狀態,但如果程序沒有寫入,無法使操作順序得到保持。 大多數時候,這出現在所謂的數據競爭中,其中一個并發操作嘗試在某些未確定的時間讀取變量,而另一個并發操作嘗試寫入同一個變量。 這里有一個簡單的例子: ``` 1 var data int 2 go func() { // 1 3 data++ 4 }() 5 if data == 0 { 6 fmt.Printf("the value is %v.\n", data) 7 } ``` 1. 在Go中,可以使用go關鍵字同時運行一個函數。 這樣做創建了所謂的goroutine。 在第3行和第5行都試圖訪問名為data的變量,但是并沒有施行任何措施保證執行的順序。運行此代碼有三種可能的結果: * 沒有輸出。在這種情況下,第3行是在第5行之前執行的。 * 輸出 the value is 0。在這種情況下,第5行和第6行在第3行之前執行。 * 輸出 the value is 1。在這種情況下,第5行在第3行之前執行,但第3行在第6行之前執行。 正如你所看到的,僅僅幾行不確定的代碼會在你的程序中引入巨大的變化。 大多數情況下,數據競爭是由于開發人員按順序思考問題而引入的。 他們認為,上一行代碼會先于下一行代碼執行。 他們假設在if語句中讀取數據變量之前,上面的goroutine將被調度并執行。 在編寫并發代碼時,你必須仔細地遍歷所有可能出現的場景。 除非你正在使用本書稍后部分介紹的一些技巧,否則保證代碼將按其在源代碼中列出的順序運行。 我有時會發現在操作之間等待很長一段時間會很有幫助。 想象一下,在調用goroutine的時間和運行的時間之間要經過一個小時。 該程序的其余部分如何運作? 如果在goroutine成功執行和程序到達if語句之間花了一個小時呢? 以這種方式思考對我有所幫助,因為對于計算機而言,規模可能不同,但相對時間差異差不多。 事實上一些開發者確實這么干并發現看起來解決了并發上的問題,我們修改上個例子看看: ``` 1 var data int 2 go func() { // 1 3 data++ 4 }() 5 time.Sleep(1*time.Second) // 這種做法實在太爛了! 6 if data == 0 { 7 fmt.Printf("the value is %v.\n", data) 8 } ``` 我們解決了數據競爭問題嗎嗎?沒有。事實上,從這個方案中產生的所有三個結果仍然是可能的。我們在調用我們的goroutine和檢查數據值之間的讓程序休眠的時間越長,程序越接近實現正確性——但這只是在概率上漸近地接近邏輯正確而已。 除此之外,這樣做已經在算法中引入了低效率。 程序現在必須休眠一秒鐘才能使我們更有可能看不到的數據競爭。如果我們使用正確的方式來編寫代碼,我們可能無需等待,或者等待時間可能只有1微秒。 這里要說的是,你應該總是以邏輯的正確性為目標。 在你的代碼中引入休眠可以是一種調試并發程序的方便方式,但不是解決方案。 數據競爭的產生條件是最隱秘的并發錯誤類型之一,因為它們可能在代碼投入生產后才會展現出來。 它們通常是由代碼執行環境發生變化或前所未有的突發事件引起的。 在這些情況下,代碼看起來行為正確,但實際上,這些操作按順序執行的出現不確定性的幾率非常高。 * * * * * 學識淺薄,錯誤在所難免。我是長風,歡迎來Golang中國的群(211938256)就本書提出修改意見。
                  <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>

                              哎呀哎呀视频在线观看