我有一些 Rust 代码,将指针传递给 FFI 函数,如下所示:
let mut mu = MaybeUninit::uninit();
let mut p = mu.as_mut_ptr();
let r = unsafe {
ffi_fn(&mut p)
};
这对于一个线程来说工作得很好,但是对于许多线程,我认为 MaybeUninit::uninit()
会同时向两个线程提供相同的指针,这会导致问题。
最佳答案
正如 Optimistic Peach 和 trentcl 在评论中指出的那样,正确的方法是检索空指针 ( playground example ):
let ptr: *mut i8 = std::ptr::null_mut();
let ptr_to_ptr: *const *mut i8 = &ptr;
与 C 的行为相同:即使指针本身为 NULL,指向该指针的指针也是内存中的有效地址。然后,由 FFI 边界的另一侧将此地址更改为 0x0
以外的地址,您将获得该更改(因为您也可以直接引用它)。
关于pointers - 如何创建可以以线程安全方式传递给 FFI 函数的未初始化指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58158069/