Heim > Artikel > Backend-Entwicklung > 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!
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!
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) } }
gettestbananafunc
和 gettestapplefunc
wird der Fehlerzeiger als Parameter übergeben. gettestapplefunc
ausgeführt werden. 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!