Heim  >  Artikel  >  Backend-Entwicklung  >  So beheben Sie einen Deadlock (Warten auf das Signal eines fehlgeschlagenen Tests)

So beheben Sie einen Deadlock (Warten auf das Signal eines fehlgeschlagenen Tests)

王林
王林nach vorne
2024-02-08 23:33:19699Durchsuche

So beheben Sie einen Deadlock (Warten auf das Signal eines fehlgeschlagenen Tests)

Der PHP-Editor Xiaoxin zeigt Ihnen, wie Sie das Deadlock-Problem lösen können. Deadlock ist ein häufiges Problem bei der gleichzeitigen Programmierung. Deadlock tritt auf, wenn zwei oder mehr Prozesse darauf warten, dass einander Ressourcen freigibt. Um dieses Problem zu lösen, können wir einige gängige Methoden verwenden, z. B. die Verwendung von Mutex-Sperren, die Vermeidung von Ressourcenkonkurrenz, die Verwendung von Timeout-Mechanismen usw. Durch angemessenes Design und Anpassung können wir das Auftreten von Deadlocks effektiv vermeiden und die Parallelität und Stabilität des Programms verbessern. Schauen wir uns als Nächstes genauer an, wie das Deadlock-Problem gelöst werden kann!

Frageninhalt

Ich habe zwei Goroutinen, die beim Testen zwei Testxxx-Funktionen darstellen. Ich verwende Bedingungsvariablen, um diese Goroutinen zu synchronisieren. Sobald jedoch einer der Tests fehlschlägt, wartet der andere auf ein Signal. Der Stillstand naht. Wenn testfunctionb fehlschlägt, möchte ich außerdem, dass auch testfunctiona fehlschlägt.

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()
}

Ich habe einige Methoden ausprobiert, wie zum Beispiel:

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()
}

Aber wenn functionb keine Fehler hat, wird a_t.fail() trotzdem ausgelöst.

Ich denke auch darüber nach, context.context() zu verwenden. Allerdings weiß ich nicht, wie ich die Testfunktion im Kontext ausführen soll. Vielen Dank, dass Sie meine Frage gelesen haben! Ich freue mich über jeden Kommentar oder jede Diskussion!

Workaround

Ein Test sollte nicht mit einem anderen Test interagieren. Wenn wir jedoch Subtests verwenden, können wir alles zwischen Testfällen teilen.

Hier ist ein Beispiel:

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)
    }
}
  • In der Funktion gettestbananafuncgettestapplefunc wird der Fehlerzeiger als Parameter übergeben.
  • Im obigen Beispiel muss als Erstes gettestapplefunc ausgeführt werden.
  • Wenn die Zuweisung in gettestapplefunc 中赋值错误(如上例所示),则 gettestbananafunc falsch ist (wie im Beispiel oben), schlägt die Funktion gettestbananafunc fehl.

Das obige ist der detaillierte Inhalt vonSo beheben Sie einen Deadlock (Warten auf das Signal eines fehlgeschlagenen Tests). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen