Com*_*nda 2 c++ ffi void-pointers rust rust-bindgen
我使用bindgen为相机的C++库创建了一个Rust包装器,并且C++库中的相机句柄定义为typedef void camera_handlebindgen移植的:
pub type camera_handle = ::std::os::raw::c_void;
Run Code Online (Sandbox Code Playgroud)
我能够成功连接到相机并拍摄图像,但是我想在单独的线程上运行代码来控制相机的温度,本质上是根据相机的当前温度改变冷却器功率,我想要与其余代码分开运行。这些调用需要相机句柄,但是当我生成新线程时,我不断收到错误:
pub type camera_handle = ::std::os::raw::c_void;
Run Code Online (Sandbox Code Playgroud)
在它的下面,它提到:
'*mut std::ffi::c_void' cannot be sent between threads safely
Run Code Online (Sandbox Code Playgroud)
如何将其发送到另一个线程,以便我也可以在那里使用该相机手柄?我尝试过使用脆弱和send_wrapper,但两者都没有成功。
指针不会实现Sendor ,Sync因为它们的安全性逃过了编译器的注意。您的目的是明确指示指针何时可以安全地跨线程使用。Send这通常是通过您实现和/或Sync您自己实现的包装类型来完成的:
struct CameraHandle(*mut c_void);
unsafe impl Send for CameraHandle {}
unsafe impl Sync for CameraHandle {}
Run Code Online (Sandbox Code Playgroud)
由于手动实现这些特征unsafe,您应该格外努力以确保外部库中的类型实际上可以移动到另一个线程 ( Send) 和/或可以由多个线程共享 ( Sync)。
如果您曾经在没有 保护的情况下利用指针的可变性&mut self,那么可能不应该这样做,因为同时Sync拥有两个总是不健全的。&mut T
看:
| 归档时间: |
|
| 查看次数: |
1960 次 |
| 最近记录: |