Ein extrem häufiges Muster in Rust ist Arc<Mutex<T>>
, wobei Arc
bietet die Speicherverwaltung, und Mutex
bietet sicheren Multithread-Zugriff auf die Ressource. Was sonst könnte anstelle von Arc
verwendet werden, und unter welchen Umständen?Wann würden Sie einen Mutex ohne Arc verwenden?
Antwort
Arc
ist natürlich die häufigste in diesem Zusammenhang, aber es gibt andere Zeigertypen, die Freigabe zulassen. Das wichtigste (und am häufigsten im Rest von Rust) ist die gemeinsame Referenz &T
. Dies funktioniert normalerweise nicht mit std::thread::spawn
'd Threads, weil es im Allgemeinen auf Daten zeigt, die von einem anderen Thread gesteuert werden, und ist daher normalerweise nicht 'static
(besonders wenn es ein &Mutex<T>
ist). Sie können jedoch einen scoped thread verwenden, um einen Thread zu erstellen, der Daten mit seinem übergeordneten Element teilen kann. Z.B.
extern crate crossbeam;
use std::sync::Mutex;
fn main() {
let data = Mutex::new(vec![0, 1]);
crossbeam::scope(|scope| {
// these run concurrently:
let _guard = scope.spawn(|| {
data.lock().unwrap().push(2);
});
data.lock().unwrap().push(3);
});
println!("{:?}", *data.lock().unwrap());
// one of [0, 1, 2, 3] or [0, 1, 3, 2]
}
Die Art des data
in der Schließung zu scope.spawn
geben wird, ist in der Tat &Mutex<Vec<i32>>
(da sie nicht das move
Schlüsselwort haben die Schließung des Standard-Capturing-Stil verwendet: Bezug genommen wird).
&
und Arc
sind die beiden, die diese Art der threadsicheren Freigabe in der Standardbibliothek/Sprache erreichen können, aber man kann auch Zeigertypen schreiben, die eine threadsichere Freigabe in externen Bibliotheken bieten.
Jedoch weg von der Pointer<Mutex<...>>
Muster kann es nützlich sein, den Mutex und die Freigabe getrennt zu haben, z.B. Arc<Vec<Mutex<T>>>
erlaubt es, ohne dass Arc
jeder individuell eine Anzahl von Mutex<T>
‚s zu teilen, oder vielleicht will man eine Abstraktion haben um einen Mutex
, und es so wickeln in einem struct
:
struct Wrapped {
data: Mutex<T>
}
impl Wrapped {
// fancy methods that abstract over `data.lock()`
}
One wahrscheinlich würde dann siehe Arc<Wrapped>
(oder ein anderer Zeiger, der das Teilen erlaubt).
- 1. Wann würden Sie XamlServices.Transform() verwenden?
- 2. Wann würden Sie PendingIntent verwenden?
- 3. Wann würden Sie Generische Sammlungen nicht verwenden?
- 4. Wann würden Sie GUIDs als Primärschlüssel verwenden?
- 5. Wann würden Sie Delegierte in C# verwenden?
- 6. Wann Mutex mit Iteration verwenden. C++
- 7. Wann würden Sie das Schlüsselwort $ this in PHP verwenden?
- 8. Wann verwenden Sie lock und unnamed Mutex in .NET?
- 9. Was ist SAPI und wann würden Sie es verwenden?
- 10. Wann würden Sie den Zugriffsmodifizierer "protected internal" verwenden?
- 11. Wann und warum würden Sie Apache commons-digester verwenden?
- 12. Wann würden Sie keine stark typisierte ASP.NET MVC-Ansicht verwenden?
- 13. Wann würden Sie XML über JSON für Ajax verwenden?
- 14. Wann würden Sie das Mediator Design Pattern verwenden?
- 15. Ereignisbenachrichtigung ohne Mutex
- 16. Warum würden Sie einen Contexpr auf einem Konstruktor verwenden?
- 17. Wann verwenden Sie Tabellencluster?
- 18. Wo würden Sie C# Runtime Compilation verwenden?
- 19. Wann sollten Sie explizit einen StringBuilder verwenden?
- 20. Warum würden Sie string.toString() verwenden?
- 21. Warum würden Sie Umask verwenden?
- 22. Wenn Sie einen Kalender in HTML programmieren würden, würden Sie Table-Tags oder Div-Tags verwenden?
- 23. Wie würden Sie einen „Konstruktor“
- 24. Swift ohne ARC
- 25. Apples Erreichbarkeit ohne ARC
- 26. Wann verwenden Sie private Methoden?
- 27. Wenn Sie Webanwendungen entwickeln, wann würden Sie eine Graphdatenbank im Vergleich zu einer Dokumentendatenbank verwenden?
- 28. Warum würden Sie einen unveränderlichen Wert in einem Wörterbuch verwenden?
- 29. Wann würden Sie ein Semikolon nach einer Methode schließen Klammer?
- 30. Was ist eine ABSTRACT CLASS und INTERFACE und wann würden Sie sie in PHP verwenden?
der Link ist tot fyi, wie auf ihrer Kiste-Seite: "Diese Kiste ist veraltet. Das Crossbeam-Projekt befindet sich derzeit in einer Übergangsphase. Wir schreiben die Epoche Garbage Collection, sowie einige andere Dienstprogramme und neue Strukturen hinzufügen. Um den Fortschritt zu verfolgen, werfen Sie bitte einen Blick auf andere Kisten im Projekt hier. Wenn der Übergang abgeschlossen ist, wird diese Kiste aktualisiert, um den neuen Code zu verwenden. " – EmmaGamma