gpt4 book ai didi

rust - 使用自旋锁和lazy_static!在静态结构上

转载 作者:行者123 更新时间:2023-12-03 11:42:04 25 4
gpt4 key购买 nike

我试图创建一个具有s静态生存期的可变结构(中断描述符表)。由于static mut不安全,因此我使用了lazy_static和互斥锁的替代方法,如下所示

use lazy_static::lazy_static;
use spin::Mutex;

lazy_static! {
pub static ref IDT: Mutex<idt_type> = Mutex::new(...);
}

我的“idt_type”有一个将静态自我作为性能指标的方法,如下所示:
impl idt_type {
pub fn load(&'static self);
}

但是我尝试使用这种方法
IDT.lock().load();

由于lock()返回了一个非静态的MutexGuard,编译器会提示:
         IDT.lock().load();
| ^^^^^^^^^^-------- temporary value is freed at the end of this statement
| |
| creates a temporary which is freed while still in use
| argument requires that borrow lasts for `'static`

有什么办法可以解决?

最佳答案

从您在此处显示的简化代码来看,在IDT类型内移动Mutex将完成此工作:

use lazy_static::lazy_static;
use spin::Mutex;

lazy_static! {
pub static ref IDT: IdtType = IdtType(Mutex::new(0));
}

pub struct IdtType(Mutex<i32>);

impl IdtType {
pub fn load(&'static self) {
self.0.lock();
}
}

fn main() {
IDT.load();
}

现在,您有责任正确地实现锁定逻辑,而不是您的 crate 用户。因此,它还具有减少滥用API的额外好处。

关于rust - 使用自旋锁和lazy_static!在静态结构上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59595801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com