如何将 c_void 发送到另一个线程
How to send c_void to another thread
我使用 bindgen
为相机的 C++ 库创建了一个 Rust 包装器,C++ 库中的相机句柄定义为 typedef void camera_handle
,bindgen
移植为 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 有点陌生,曾尝试使用 fragile
和 send_wrapper
进行包装,但都没有成功。
指针不实现 Send
或 Sync
,因为它们的安全逃脱了编译器。您打算明确指示指针何时可以安全地跨线程使用。这通常是通过您自己实现 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
同时总是不健全。
参见:
- Send and Sync 在 Rustonomicon 中。
我使用 bindgen
为相机的 C++ 库创建了一个 Rust 包装器,C++ 库中的相机句柄定义为 typedef void camera_handle
,bindgen
移植为 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 有点陌生,曾尝试使用 fragile
和 send_wrapper
进行包装,但都没有成功。
指针不实现 Send
或 Sync
,因为它们的安全逃脱了编译器。您打算明确指示指针何时可以安全地跨线程使用。这通常是通过您自己实现 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
同时总是不健全。
参见:
- Send and Sync 在 Rustonomicon 中。