如何将 c_void 发送到另一个线程

How to send c_void to another thread

我使用 bindgen 为相机的 C++ 库创建了一个 Rust 包装器,C++ 库中的相机句柄定义为 typedef void camera_handlebindgen 移植为 pub type camera_hanlde = ::std::os::raw::c_void.

我能够成功连接到相机并拍摄图像,但是我想 运行 在单独的线程上编写代码以控制相机的温度,本质上是根据当前温度改变冷却器功率相机,我想 运行 与其余代码分开。这些调用需要相机句柄,但是当我生成新线程时,我不断收到错误消息:

'*mut std::ffi::c_void' cannot be sent between threads safely

在它下面提到了 the trait 'std::marker::Send' is not implemented for '*mut std::ffi::c_void'

我怎样才能将它发送到另一个线程,这样我也可以在那里使用这个相机手柄?我对 Rust 有点陌生,曾尝试使用 fragilesend_wrapper 进行包装,但都没有成功。

指针不实现 SendSync,因为它们的安全逃脱了编译器。您打算明确指示指针何时可以安全地跨线程使用。这通常是通过您自己实现 Send and/or Sync 的包装器类型完成的:

struct CameraHandle(*mut c_void);

unsafe impl Send for CameraHandle {}
unsafe impl Sync for CameraHandle {}

由于手动实现这些特征是 unsafe,您应该格外勤奋以确保来自外部库的类型 实际上 可以移动到另一个线程(Send) and/or 可以被多个线程共享(Sync).

如果你在没有 &mut self 保护的情况下利用指针的可变性,它应该 而不是 Sync 因为有两个 &mut T同时总是不健全。

参见: