Das Rust-Buch sagt, dass Rohzeiger "als sendbar angesehen werden (wenn ihr Inhalt als sendbar angesehen wird)".
Wie ich jedoch sehen kann, generiert der Compiler den Fehler the trait
core::marker::Send is not implemented for the type
wenn er auf einen Rohzeiger auf einen Sendable-Typ trifft.
Es könnte sein, dass ich etwas falsch mache, die Dokumentation unklar ist oder die Fehlermeldung nicht hilfreich ist, um das eigentliche Problem mit diesem Code anzuzeigen.
extern crate core;
use std::thread::Thread;
struct ShouldBeSendable {
x: i32
}
unsafe impl core::marker::Send for ShouldBeSendable { }
fn main() {
let sendablePtr : *const ShouldBeSendable = &ShouldBeSendable {x: 5};
let closure = move |:| {
*sendablePtr;
};
let something = Thread::spawn(closure);
}
Erzeugt einen Fehler:
test.rs:15:21: 15:34 error: the trait `core::marker::Send` is not implemented for the type `*const ShouldBeSendable` [E0277]
test.rs:15 let something = Thread::spawn(closure);
^~~~~~~~~~~~~
test.rs:15:21: 15:34 note: `*const ShouldBeSendable` cannot be sent between threads safely
test.rs:15 let something = Thread::spawn(closure);
^~~~~~~~~~~~~
error: aborting due to previous error
$ rustc --version
rustc 1.0.0-dev (d15192317 2015-01-25 16:09:48 +0000)
Dies hat sich kürzlich geändert, wodurch die Dokumente veraltet sind. Danke für das Bemerken und Einreichen eines Fehlers!
@drewcrawford Sie können den Wrapper Unique
, um Ihren Rohzeiger Send
Lage zu versetzen . Diese modifizierte Version Ihres Codes funktioniert:
use std::ptr::Unique;
use std::thread::Thread;
#[derive(Copy)]
struct ShouldBeSendable {
x: i32
}
unsafe impl std::marker::Send for ShouldBeSendable { }
fn main() {
let ptr : *mut ShouldBeSendable = &mut ShouldBeSendable {x: 5}; // this is not `Send`
let sendablePtr = Unique(ptr); // but this is!
let closure = move |:| {
// `sendablePtr` con be moved inside this closure
let ptr = sendablePtr.0; // unpack the raw pointer
println!("{}", unsafe { (*ptr).x })
};
let something = Thread::scoped(closure).join();
}
@japaric Beispiel für Rust 1.25 mit NonNull
.
https://play.rust-lang.org/?gist=1ce2532a0eefc60695663c26faddebe1&version=stable
Hilfreichster Kommentar
@japaric Beispiel für Rust 1.25 mit
NonNull
.https://play.rust-lang.org/?gist=1ce2532a0eefc60695663c26faddebe1&version=stable