如何安全地获取指向同一个 int 的两个可变指针?
How to safely get two mutable pointers to same int?
我想创建一个包装 libc sem_post
和 sem_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 指针类型。
我想创建一个包装 libc sem_post
和 sem_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 指针类型。