rid*_*ish 1 unsafe-pointers rust
我想创建一个包装 libcsem_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()) };
}
}
Run Code Online (Sandbox Code Playgroud)
这安全吗?有更好的方法吗?谢谢你的帮助!
原始指针、*mut T或*const T类型没有别名要求或其他有效性约束。创建指针总是安全的;请注意,这UnsafeCell::get()不是一个unsafe fn.
在这种情况下,通过使用,UnsafeCell您还可以确保 Rust 不会因为使用指针而违反预期libc。sema: i32(例如,如果您有 ,情况就不会如此。)
我不会说你的信号量代码是健全或正确的,因为我不熟悉这些函数,但我有信心说它没有滥用 Rust 指针类型。
| 归档时间: |
|
| 查看次数: |
191 次 |
| 最近记录: |