Wenn ich Arbeit an Threads delegiere, habe ich oft ein Stück Daten, das alle Threads überlebt. Ein Beispiel wäre numbers
im folgenden Beispiel:
Es wird nirgends geändert, und wegen der join
s ist garantiert, dass die Threads damit arbeiten. Der Borg-Checker von Rust kann das jedoch nicht sagen.
Die Lösungen, die ich bisher gesehen habe, beinhalten das Klonen des Datenstücks (oder das Klonen eines Arc
der Daten). Ist es möglich, dies ohne Klonen zu tun?
Nein. Aber Sie haben vielleicht eine falsche Vorstellung: Beim Klonen eines Arc
wird nur ein Referenzzähler inkrementiert und eine Kopie eines Zeigers erstellt; es führt keine Zuordnung durch. ( Bearbeiten : Wenn Sie etwas in ein Arc
einfügen, ist das natürlich eine Zuweisung, aber Sie ordnen es bereits zu, um das vec!
zu erstellen, also ist eine zusätzliche Zuweisung fester Größe nicht möglich. Das wird wahrscheinlich weh tun.)
(Wenn Sie wirklich brauchen, ist die Länge, können Sie außerhalb die Thread-Schließung berechnen und in einer Variablen speichern; ein usize
hat keine Probleme beim Überqueren einer Thread-Grenze.)
Das Problem ist, dass zur Zeit borrows lexikalisch sind, also sogar if konnte der Compiler aus der Verwendung von join()
schließen, dass ein bestimmter Thread an eine begrenzte Lebensdauer gebunden ist ... es versucht es nicht einmal.
There war ein thread::scoped
-Konstruktor, mit dem Sie nicht- 'static
-Referenzen übergeben konnten, der jedoch aufgrund eines Speichersicherheitsproblems deaktiviert werden musste. Es kommt ein Ersatz, aber (ab Rust 1.0 und wahrscheinlich 1.1) ist es noch nicht fertig.
Also jetzt, in sicherem oder nicht nächtlichem Code ... nein, das kannst du nicht.
Tags und Links multithreading rust borrow-checker