Rust: core::marker::Sende- und Rohzeiger

Erstellt am 28. Jan. 2015  ·  3Kommentare  ·  Quelle: rust-lang/rust

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)

Hilfreichster Kommentar

Alle 3 Kommentare

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();
}
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen