Rust: inti::penanda::Kirim dan petunjuk mentah

Dibuat pada 28 Jan 2015  ·  3Komentar  ·  Sumber: rust-lang/rust

Buku Rust mengatakan bahwa pointer mentah "dianggap dapat dikirim (jika isinya dianggap dapat dikirim)".

Namun dari apa yang saya lihat, kompiler menghasilkan kesalahan the trait core::marker::Send is not implemented for the type ketika menemukan pointer mentah ke tipe Sendable.

Bisa jadi saya melakukan sesuatu yang salah, bisa jadi dokumentasinya tidak jelas atau bisa jadi pesan kesalahan tidak membantu menunjukkan apa pun masalah sebenarnya dengan kode ini.

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);
}

Menghasilkan kesalahan:

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)

Komentar yang paling membantu

@japaric contoh untuk Rust 1.25 menggunakan NonNull .

https://play.rust-lang.org/?gist=1ce2532a0eefc60695663c26faddebe1&version=stable

Semua 3 komentar

Ini berubah baru-baru ini, membuat dokumen ketinggalan zaman. Terima kasih telah memperhatikan dan mengajukan bug!

@drewcrawford Anda dapat menggunakan pembungkus Unique untuk membuat pointer mentah Anda Send dapat digunakan. Versi kode Anda yang dimodifikasi ini berfungsi:

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 contoh untuk Rust 1.25 menggunakan NonNull .

https://play.rust-lang.org/?gist=1ce2532a0eefc60695663c26faddebe1&version=stable

Apakah halaman ini membantu?
0 / 5 - 0 peringkat