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

王林
Freigeben: 2024-02-08 23:33:19
nach vorne
690 Leute haben es durchsucht

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()
}
Nach dem Login kopieren

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()
}
Nach dem Login kopieren

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)
    }
}
Nach dem Login kopieren
  • 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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!