Как мне создать неинициализированные указатели, которые я могу передать функциям FFI потокобезопасным способом? - PullRequest
1 голос
/ 29 сентября 2019

У меня есть некоторый код Rust, который передает указатели на функцию FFI следующим образом:

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

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

Это прекрасно работает с одним потоком, но я думаю, что со многими потоками MaybeUninit::uninit() даст один и тот же указатель на двапотоки одновременно, что вызывает проблемы.

1 Ответ

1 голос
/ 30 сентября 2019

Как отметили в комментариях Optimistic Peach и trentcl, правильный способ сделать это - получить нулевой указатель ( пример игровой площадки ):

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

То же поведениекак применяется C: даже если сам указатель NULL, указатель на него является действительным адресом в памяти. Затем до другой стороны границы FFI можно будет изменить этот адрес на значение, отличное от 0x0, и вы получите это изменение (поскольку у вас также есть прямая ссылка на него).

...