0

我使用 为相机的 C++ 库创建了一个 Rust 包装器,并且 C++ 库中bindgen的相机句柄被定义为typedef void camera_handle移植bindgenpub 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包装,但都没有成功。

4

1 回答 1

5

指针没有实现Send,或者Sync因为它们的安全性超出了编译器。您打算明确指示何时可以安全地跨线程使用指针。这通常是通过您实现Send和/或您Sync自己的包装器类型完成的:

struct CameraHandle(*mut c_void);

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

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

如果您在没有 保护的情况下利用指针的可变性&mut self,则可能应该这样做Sync,因为同时拥有两个&mut T总是不合理的。

看:

于 2021-09-22T23:57:24.707 回答