我有一些Rust代码可以将指针传递给这样的FFI函数:
let mut mu = MaybeUninit::uninit();
let mut p = mu.as_mut_ptr();
let r = unsafe {
ffi_fn(&mut p)
};
这对于一个线程可以很好地工作,但是对于许多线程,我认为MaybeUninit::uninit()
将同时为两个线程提供相同的指针,这会导致问题。
答案 0 :(得分:1)
正如Optimistic Peach和trentcl在评论中指出的那样,正确的方法是检索空指针(playground example):
let ptr: *mut i8 = std::ptr::null_mut();
let ptr_to_ptr: *const *mut i8 = &ptr;
与C相同的行为:即使指针本身是NULL
,指向它的指针也是内存中的有效地址。然后,将地址更改为0x0
之外的其他地址,直到FFI边界的另一端,您将获得该更改(因为您也直接引用了该地址)。