簡體   English   中英

如何將指針發送到另一個線程?

[英]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 ,但都沒有成功。

指針不實現SendSync ,因為它們的安全性逃脫了編譯器。 您打算明確指示何時可以安全地跨線程使用指針。 這通常是通過您自己實現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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM