如何在 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
    }
}