capypad
0 Tage Serie
rust / expert
Snippet

Manuelle Send/Sync-Implementierung für FFI-Wrapper

Standardmäßig sind Typen, die Raw Pointer enthalten, weder Send noch Sync. Um sie zwischen Threads zu übergeben oder Referenzen threadübergreifend zu teilen, müssen diese Marker-Traits manuell implementiert werden. Dies erfordert einen 'unsafe'-Block, da der Compiler nicht verifizieren kann, ob die Synchronisationslogik oder das Pointer-Management korrekt ist.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct RawBuffer {
ptr: *mut u8,
len: usize,
}
 
// SAFETY: We ensure that access to the buffer is synchronized
// and that the pointer is valid for the duration of its use.
unsafe impl Send for RawBuffer {}
unsafe impl Sync for RawBuffer {}
 
impl RawBuffer {
pub fn as_slice(&self) -> &[u8] {
unsafe { std::slice::from_raw_parts(self.ptr, self.len) }
}
}
Erklärung
1
unsafe impl Send for RawBuffer {}
Bestätigt, dass es sicher ist, das Eigentum an RawBuffer auf einen anderen Thread zu übertragen.
2
unsafe impl Sync for RawBuffer {}
Bestätigt, dass es sicher ist, Referenzen auf RawBuffer über mehrere Threads hinweg zu teilen.