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)
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
Komentar yang paling membantu
@japaric contoh untuk Rust 1.25 menggunakan
NonNull
.https://play.rust-lang.org/?gist=1ce2532a0eefc60695663c26faddebe1&version=stable