[英]How to send a pointer to another thread?
我為使用bindgen的相機創建了 C++ 庫的 Rust 包裝器,並在 C++ 庫中定義為typedef void camera_handle
庫中的相機句柄
pub type camera_handle = ::std::os::raw::c_void;
我能夠成功連接到相機並拍攝圖像,但是我想在一個單獨的線程上運行代碼來控制相機的溫度,本質上是根據我想要的相機的當前溫度來改變冷卻器的功率與代碼的 rest 分開運行。 這些調用需要相機句柄,但是當我生成一個新線程時,我不斷收到錯誤消息:
'*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'
我怎樣才能將它發送到另一個線程,以便我也可以在那里使用這個相機手柄? 我曾嘗試使用脆弱和send_wrapper ,但都沒有成功。
指針不實現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
總是不合理的。
看:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.