Probleme beim Freigeben von Referenzen zwischen Threads

8

Ich habe einen Thread, der Worker-Threads startet, von denen erwartet wird, dass sie für immer leben. Jeder Worker-Thread behält seine eigene Liste von Socket s bei.

Einige Operationen erfordern, dass ich alle derzeit aktiven Sockets traverse, aber ich habe Probleme mit Lebensläufen zu versuchen, eine Master-Liste von Sockets zu erstellen, die einen Zeiger auf einen Socket enthalten, der einer anderen Liste gehört.

%Vor%

Die Fehler, die ich erhalte ...

%Vor%

Ich weiß nicht einmal, ob das, was ich versuche, als sicherer Code möglich ist.

Ich möchte, dass mastersocketlist einen Zeiger auf einen Socket enthält, in dem die Lebensdauer des Sockets durch den Thread definiert ist, der ihn erstellt hat. Ich glaube, das ist es, was all diese Fehler bedeuten, aber ich habe keine Ahnung, wie ich die richtigen lebenslangen Anmerkungen bereitstellen kann, um es zu beheben.

    
nathansizemore 22.02.2015, 05:47
quelle

1 Antwort

23

Eine großartige Sache bei Rust ist, dass die Typüberprüfung von Funktionen ausschließlich von der Funktionssignatur durchgeführt wird. Das bedeutet, dass Sie die meisten Funktionskörper durch unimplemented!() ersetzen und Typprüfungsfehler beibehalten können.

Wiederholen Sie diesen Vorgang ein paar Mal, und Sie am Ende nicht viele Funktionen aufrufen - entfernen Sie diese. Inlining-Module und reduzierende Strukturen / enums können ebenfalls helfen.

Irgendwann wird Ihr Fehler verschwinden - der erste Hinweis auf das Problem! Bleib dran und du bekommst eine winzige Reproduktion:

%Vor%

Auschecken des Fehlers, es stimmt immer noch überein:

%Vor%

Sehen wir uns die Dokumente für die Signatur von thread::spawn an:

%Vor%

Der entscheidende Punkt hier ist F: Send + 'static - die Schließung, die Sie spawn geben, darf nur Referenzen enthalten, die die gesamte Lebensdauer des Programms ausmachen . Dies liegt daran, dass spawn Threads erstellen kann, die detached werden. Einmal gelöst, könnte der Thread für immer leben, also müssen alle Referenzen mindestens so lange leben, sonst würden Sie dangling references bekommen, eine schlechte Sache! Rust rettet den Tag noch einmal!

Wenn Sie sicherstellen möchten, dass die Threads an einem bekannten Punkt enden, können Sie Scoped-Threads verwenden, wie sie beispielsweise von scoped-threadpool oder Querbalken .

Wenn Ihr Code keine Variable mit einer Gültigkeitsdauer innerhalb des Codes enthielt, verwenden Sie eine Art gemeinsamen Eigentümer wie Arc gepaart mit etwas, das sicherstellt, dass nur ein Thread die Variable mutieren kann, wie zB Mutex wäre ausreichend gewesen. Dadurch kann jeder Thread den gemeinsam genutzten Wert besitzen und ihn schließlich löschen, wenn der letzte Thread beendet wird. Weitere Informationen finden Sie unter Veränderbares Objekt zwischen Threads teilen .

    
Shepmaster 22.02.2015, 18:24
quelle

Tags und Links