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
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.