如何安全地获取指向同一个 int 的两个可变指针?

How to safely get two mutable pointers to same int?

我想创建一个包装 libc sem_postsem_wait 函数的 Rust 信号量,这两个函数都采用可变 int * 参数。这要求服务员和发帖人同时拥有一个指向同一个 int 的可变指针。我怎样才能在不冒 UB 风险的情况下安排它?

我的一个想法是使用 UnsafeCell:

use libc;
use std::cell::UnsafeCell;

pub struct Sema {
    sema: UnsafeCell<i32>,
}

impl Sema {
    pub fn post(&self) {
        unsafe { libc::sem_post(self.sema.get()) };
    }

    pub fn wait(&self) {
        unsafe { libc::sem_wait(self.sema.get()) };
    }
}

这样做安全吗,有没有更好的方法?感谢您的帮助!

原始指针*mut T*const T 类型,没有别名要求或其他有效性约束。创建指针总是安全的;请注意 UnsafeCell::get() 不是 unsafe fn.

并且在这种情况下,通过使用 UnsafeCell 您还确保了 Rust 没有预期会被 使用 指针与 libc. (例如,如果您有 sema: i32,情况就不会如此。)

我不会说你的信号量代码是合理的或正确的,因为我不熟悉这些函数,但我有信心地说这不是 滥用 Rust 指针类型。