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

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # **當Add()和Done()的數量不匹配時會發生什么?** 當`sync.Add()`和`sync.Done()`調用的數量相等時,程序會正常運行。但是,本節將告訴你當調用數量不一致時會發生什么。 假如我們執行`sync.Add()`的次數大于執行`sync.Done()`的次數,這種情況下,通過在第一個`fmt.Printf(“%#v \ n”,waitGroup)`之前添加`waitGroup.Add(1)`語句,然后執行go run的輸出如下: ```bash $ go run syncGo.go Going to create 20 goroutines. sync.WaitGroup{noCopy:sync.noCopy{}, state1:[12]uint8{0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, sema:0x0} sync.WaitGroup{noCopy:sync.noCopy{}, state1:[12]uint8{0x0, 0x0, 0x0, 0x0, 0x15, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, sema:0x0} 19 10 11 12 13 17 18 8 5 4 6 14 1 0 7 3 2 15 9 16 fatal error: all goroutines are asleep - deadlock! goroutine 1 [semacquire]: sync.runtime_Semacquire(0xc4200120bc) /usr/local/Cellar/go/1.9.3/libexec/src/runtime/sema.go:56 +0x39 sync.(*WaitGroup).Wait(0xc4200120b0) /usr/local/Cellar/go/1.9.3/libexec/src/sync/waitgroup.go:131 +0x72 main.main() /Users/mtsouk/Desktop/masterGo/ch/ch9/code/syncGo.go:28 +0x2d7 exit status 2 ``` 錯誤消息是很清楚的: `fatal error: all goroutines are asleep - deadlock!`.,這是因為你通過調用`sync.Add(1)`函數`n+1`次來告訴程序等待`n+1`個`goroutine`,而`n`個`goroutine`只執行了`n`個`sync.Done()`語句。因此,`sync.Wait()`調用將無限期地等待一個或多個對`sync.Done()`的調用,而不會有任何結果,這顯然是死鎖的情況。 如果使用的`sync.Add()`調用比`sync.Done()`調用少,那么可以通過在`syncGo.go`的for循環之后添加waitGroup.Done()語句來進行模擬。那么執行后輸出類似如下的結果: ```bash $ go run syncGo.go Going to create 20 goroutines. sync.WaitGroup{noCopy:sync.noCopy{}, state1:[12]uint8{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, sema:0x0} sync.WaitGroup{noCopy:sync.noCopy{}, state1:[12]uint8{0x0, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, sema:0x0} 19 6 1 2 9 7 8 15 13 0 14 16 17 3 11 4 5 12 18 10 panic: sync: negative WaitGroup counter goroutine 22 [running]: sync.(*WaitGroup).Add(0xc4200120b0, 0xffffffffffffffff) /usr/local/Cellar/go/1.9.3/libexec/src/sync/waitgroup.go:75 +0x134 sync.(*WaitGroup).Done(0xc4200120b0) /usr/local/Cellar/go/1.9.3/libexec/src/sync/waitgroup.go:100 +0x34 main.main.func1(0xc4200120b0, 0x11) /Users/mtsouk/Desktop/masterGo/ch/ch9/code/syncGo.go:25 +0xd8 created by main.main /Users/mtsouk/Desktop/masterGo/ch/ch9/code/syncGo.go:21 +0x206 exit status 2 ``` 這次問題的根源也非常清楚:`panic: sync: negative WaitGroup counter`。雖然這兩種情況下的錯誤消息都非常具體,可以幫助你解決實際的問題,但是你應該非常小心地處理放入程序中的`sync.Add()`和`sync.Done()`調用的數量。另外,請注意,第二個錯誤情況(`panic: sync: negative WaitGroup counter`)可能并不總是出現。
                  <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>

                              哎呀哎呀视频在线观看