< 返回版块

kcrazy 发表于 2021-03-24 17:43

想实现以下简单的功能,死活编译不过,求助

/* 想实现一个抽象的接口,来给所有模块初始化 */
pub trait IModule: Sync {
    fn _initialize(&mut self) -> Result<()>;
    fn _unload(&mut self);
}

/* 模块 A */
pub struct A {
    tree: BTreeMap<i32, i32>,
}

/* 模块 A,实现接口 IModule */
impl IModule for A {
    fn _initialize(&mut self) -> Result<()> {
        Ok(())
    }
    fn _unload(&mut self) {}
}

impl A {
    pub fn new() -> Self {
        A {
            tree: Default::default(),
        }
    }
}

/* 所有的实例都放到数组里 */
lazy_static! {
    static ref s_modules:[&'static IModule; 1] = [&ProcessManager::new()];
}

/* 然后写个循环来初始化 */
pub fn kmm_startup() -> Result<()> {

    for m in s_modules.into_iter() {
        m._initialize();
    }
    Ok(())
}

/* 反初始化 */
pub fn kmm_stop() {
    for &m in s_modules.into_iter() {
        m._unload();
    }
}

评论区

写评论
phper-chen 2021-03-25 10:19

rust的全局变量为了防止竞态 死锁等不安全问题 是需要使用arc来包的 建议先看看书比较好

作者 kcrazy 2021-03-25 09:56

非常感谢~

--
👇
ywxt:

use std::{collections::BTreeMap, sync::{Arc, Mutex}};
use lazy_static::lazy_static;
type Result<T> = std::result::Result<T, ()>;
pub trait IModule: Sync + Send {
    fn _initialize(&mut self) -> Result<()>;
    fn _unload(&mut self);
}

/* 模块 A */
pub struct A {
    tree: BTreeMap<i32, i32>,
}

/* 模块 A,实现接口 IModule */
impl IModule for A {
    fn _initialize(&mut self) -> Result<()> {
        println!("A initializing");
        Ok(())
    }
    fn _unload(&mut self) {
        println!("A unloading");
    }
}

impl A {
    pub fn new() -> Self {
        A {
            tree: Default::default(),
        }
    }
}

/* 所有的实例都放到数组里 */
lazy_static! {
    static ref s_modules: Arc<Mutex<[Box<dyn IModule>; 1]>> = Arc::new(Mutex::new([Box::new(A::new())]));
}

/* 然后写个循环来初始化 */
pub fn kmm_startup() -> Result<()> {
    let mut modules = s_modules.lock().unwrap();
    for m in (*modules).iter_mut() {
        m._initialize().unwrap();
    }
    Ok(())
}

/* 反初始化 */
pub fn kmm_stop() {
    let mut modules = s_modules.lock().unwrap();
    for m in (*modules).iter_mut() {
        m._unload();
    }
}
fn main() {
    kmm_startup().unwrap();
    kmm_stop();
}

ywxt 2021-03-24 18:25
use std::{collections::BTreeMap, sync::{Arc, Mutex}};
use lazy_static::lazy_static;
type Result<T> = std::result::Result<T, ()>;
pub trait IModule: Sync + Send {
    fn _initialize(&mut self) -> Result<()>;
    fn _unload(&mut self);
}

/* 模块 A */
pub struct A {
    tree: BTreeMap<i32, i32>,
}

/* 模块 A,实现接口 IModule */
impl IModule for A {
    fn _initialize(&mut self) -> Result<()> {
        println!("A initializing");
        Ok(())
    }
    fn _unload(&mut self) {
        println!("A unloading");
    }
}

impl A {
    pub fn new() -> Self {
        A {
            tree: Default::default(),
        }
    }
}

/* 所有的实例都放到数组里 */
lazy_static! {
    static ref s_modules: Arc<Mutex<[Box<dyn IModule>; 1]>> = Arc::new(Mutex::new([Box::new(A::new())]));
}

/* 然后写个循环来初始化 */
pub fn kmm_startup() -> Result<()> {
    let mut modules = s_modules.lock().unwrap();
    for m in (*modules).iter_mut() {
        m._initialize().unwrap();
    }
    Ok(())
}

/* 反初始化 */
pub fn kmm_stop() {
    let mut modules = s_modules.lock().unwrap();
    for m in (*modules).iter_mut() {
        m._unload();
    }
}
fn main() {
    kmm_startup().unwrap();
    kmm_stop();
}

1 共 3 条评论, 1 页