首頁  >  文章  >  後端開發  >  如何解決死鎖(等待失敗測試的訊號)

如何解決死鎖(等待失敗測試的訊號)

王林
王林轉載
2024-02-08 23:33:19670瀏覽

如何解決死鎖(等待失敗測試的訊號)

php小編小新為您介紹如何解決死鎖問題。死鎖是同時編程常見的問題,當兩個或多個行程互相等待對方釋放資源時,就會出現死鎖現象。為了解決這個問題,我們可以採用一些常見的方法,例如使用互斥鎖、避免資源競爭、使用逾時機制等。透過合理的設計和調整,我們可以有效地避免死鎖的發生,並提高程式的並發性和穩定性。接下來,讓我們一起深入了解如何解決死鎖問題吧!

問題內容

我有兩個 goroutine,它們是測試期間的兩個 testxxx 函數。我使用條件變數來同步這些 goroutine。然而,一旦其中一個測試失敗,而另一個正在等待訊號。僵局來了。另外,如果 testfunctionb 失敗,我希望 testfunctiona 也失敗。

var cond sync.cond
func testfunctiona(t *testing.t){
   // ... some codes...
   cond.wait()
}
func testfunctionb(t *testing.t){
   // ... some codes...
   t.fail()
   // ... some codes...
   cond.broadcast()
}

我嘗試過一些方法,例如:

var cond sync.Cond
var A_t *testing.T
func TestFunctionA(t *testing.T){
   // ... Some codes...
   A_t = t
   // ... Some codes...
   cond.Wait()
}
func TestFunctionB(t *testing.T){
   // ... Some codes...
   t.Cleanup(func(){
      if !A_t.Failed(){
          A_t.Fail()
      }
      cond.Broadcast()
   })
   t.Fail()
   // ... Some codes...
   cond.Broadcast()
}

但是當functionb沒有錯誤時,a_t.fail()仍然會被觸發。

我也在考慮使用 context.context()。但是,我不知道如何在上下文中運行測試函數。 感謝您閱讀我的問題!我感謝任何評論或討論!

解決方法

一個測試不應與另一個測試互動。但是,當使用子測試時,我們可以在測試案例之間共用任何內容。

這是一個範例:

#
package main

import (
    "errors"
    "testing"
)

func TestFruits(t *testing.T) {
    var err error
    t.Run("test apple", getTestAppleFunc(&err))
    t.Run("test banana", getTestBananaFunc(&err))
}

func handleError(t *testing.T, err *error) {
    if err != nil && *err != nil {
        t.Error(*err)
    }
}

func getTestAppleFunc(err *error) func(*testing.T) {
    return func(t *testing.T) {
        handleError(t, err)
        *err = errors.New("Apple failed")
    }
}

func getTestBananaFunc(err *error) func(*testing.T) {
    return func(t *testing.T) {
        handleError(t, err)
    }
}
  • 在函數 gettestbananafuncgettestapplefunc 中,錯誤指標會作為參數傳遞。
  • 在上面的範例中,首先執行的是gettestapplefunc
  • 如果在 gettestapplefunc 中賦值錯誤(如上例所示),則 gettestbananafunc 函數將會失敗。

以上是如何解決死鎖(等待失敗測試的訊號)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除