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

问题描述 投票:0回答:1

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

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

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

这在一个线程上工作正常,但在许多线程上,我认为MaybeUninit::uninit()将同时为两个线程提供相同的指针,这会导致问题。

pointers rust ffi
1个回答
0
投票

正如乐观的桃子和trentcl在评论中指出的那样,正确的方法是检索空指针(playground example:]]

let ptr: *mut i8 = std::ptr::null_mut();
let ptr_to_ptr: *const *mut i8 = &ptr;

与C的行为相同:即使指针本身是NULL,指向它的指针也是内存中的有效地址。然后,将这个地址更改为0x0以外的其他内容,将由FFI边界的另一端决定,您将获得该更改(因为您也直接引用了该地址)。

© www.soinside.com 2019 - 2024. All rights reserved.