Pointers 如何创建可以以线程安全方式传递给FFI函数的未初始化指针?

Pointers 如何创建可以以线程安全方式传递给FFI函数的未初始化指针?,pointers,rust,ffi,Pointers,Rust,Ffi,我有一些Rust代码,它将指针传递给FFI函数,如下所示: let mut mu = MaybeUninit::uninit(); let mut p = mu.as_mut_ptr(); let r = unsafe { ffi_fn(&mut p) }; 对于一个线程,这很好,但是对于许多线程,我认为maybeunit::uninit()将同时向两个线程提供相同的指针,这会导致问题。正如乐观的Peach和trentcl在评论中指出的,正确的方法是检索空指针(): 与C应用

我有一些Rust代码,它将指针传递给FFI函数,如下所示:

let mut mu = MaybeUninit::uninit();
let mut p = mu.as_mut_ptr();

let r = unsafe {
    ffi_fn(&mut p)
};

对于一个线程,这很好,但是对于许多线程,我认为
maybeunit::uninit()
将同时向两个线程提供相同的指针,这会导致问题。

正如乐观的Peach和trentcl在评论中指出的,正确的方法是检索空指针():


与C应用相同的行为:即使指针本身是
NULL
,指向它的指针也是内存中的有效地址。然后,FFI边界的另一端将此地址更改为非
0x0
,您将得到该更改(因为您也直接引用它)。

为什么要将未初始化的指针传递给函数?向程序添加线程的方法可能很多。我们需要更多的信息。无论如何,我不知道
maybeinit
与指针对于多个线程是否相同有什么关系。@mcarton例如
sqlite3\u open
将指针作为其第二个参数。在这种情况下,您可以给它
null
。但是像@trentcl一样,我认为你的问题中没有足够的信息来回答它。特别是,这与线程无关,我不明白为什么同时给这个函数赋予相同的值会是一个问题。如果
sqlite3\u open
接受一个指向某个对象的可变指针,那么第一个指针(在
maybeuniit
中保存的指针)是不相关的,因为一旦最外层指针下的值被替换,它就不同于
maybeinit
所持有的值。只要使用或。
let ptr: *mut i8 = std::ptr::null_mut();
let ptr_to_ptr: *const *mut i8 = &ptr;