如何在 Rust 中使 NonNull 成为线程安全的?
How can NonNull be made thread safe in Rust?
我无法在 Rust 中的线程之间发送非空类型。我需要为 Windows rust API.
在 NonNull 指针上调用一个方法
我已尝试 Arc<Mutex<NonNull>>
和 Arc<Mutex<RefCell<Box<NonNull>>>
,但找不到为 NonNull 发送和同步的方法。
我希望线程暂停并等待互斥量,因此调用方法或什至改变 NonNull 类型不应该是线程问题,但即使使用运行时借用检查我也会收到错误:'NonNull<c_void> cannot be sent between threads safely'
然后是列表:
required because of the requirements on the impl of 'Send'
..等等
我打算尝试将方法作为 dyn 传递,但这应该可行吧?
您需要提供 Send
的不安全实现,以通知编译器您已经考虑了指针后面对象的线程安全性(您这样做了,因为您想使用用于同步的互斥体)。例如:
// Wrapper around `NonNull<RawType>` that just implements `Send`
struct WrappedPointer(NonNull<RawType>);
unsafe impl Send for WrappedPointer {}
// Safe wrapper around `WrappedPointer` that gives access to the pointer
// only with the mutex locked.
struct SafeType {
inner: Mutex<WrappedPointer>,
}
impl SafeType {
fn some_method(&self) {
let locked = self.inner.lock();
// use ptr in `locked` to implement functionality, but don't return it
}
}
我无法在 Rust 中的线程之间发送非空类型。我需要为 Windows rust API.
在 NonNull 指针上调用一个方法我已尝试 Arc<Mutex<NonNull>>
和 Arc<Mutex<RefCell<Box<NonNull>>>
,但找不到为 NonNull 发送和同步的方法。
我希望线程暂停并等待互斥量,因此调用方法或什至改变 NonNull 类型不应该是线程问题,但即使使用运行时借用检查我也会收到错误:'NonNull<c_void> cannot be sent between threads safely' 然后是列表:
required because of the requirements on the impl of 'Send'
..等等
我打算尝试将方法作为 dyn 传递,但这应该可行吧?
您需要提供 Send
的不安全实现,以通知编译器您已经考虑了指针后面对象的线程安全性(您这样做了,因为您想使用用于同步的互斥体)。例如:
// Wrapper around `NonNull<RawType>` that just implements `Send`
struct WrappedPointer(NonNull<RawType>);
unsafe impl Send for WrappedPointer {}
// Safe wrapper around `WrappedPointer` that gives access to the pointer
// only with the mutex locked.
struct SafeType {
inner: Mutex<WrappedPointer>,
}
impl SafeType {
fn some_method(&self) {
let locked = self.inner.lock();
// use ptr in `locked` to implement functionality, but don't return it
}
}