代码之家  ›  专栏  ›  技术社区  ›  Trần Kim Dá»±

从其他线程调用的不安全库对象

  •  0
  • Trần Kim Dá»±  · 技术社区  · 3 年前

    我正在使用 tikv/raft-rs 用于实现共识系统的库。这个图书馆有 RawNode 对象是线程不安全的对象。我们必须定期对此对象执行一些函数( example ),因此我使用一个新线程来执行。

    以下是限制条件:

    • 我需要在主线程上有这个对象,但没有这个对象来访问它的一些内部状态。(例如: raw_node.is_leader )
    • 必须在工作线程上访问此对象。

    由于这些限制,这似乎是不可能的,因为:

    • 如果我创建了这个对象,并移动到新线程,主线程将无法调用其状态。
    • 如果我将此对象保留在主线程对象上,则无法使用 Arc<Mutex<>> 因为这个对象没有实现 Copy 方法。

    这是我的代码:

    use std::thread::JoinHandle;
    use std::sync::{Arc, Mutex, mpsc};
    use std::collections::{VecDeque, HashMap};
    use raft::RawNode;
    use std::sync::mpsc::{Receiver, Sender, TryRecvError};
    
    use protobuf::Message as PbMessage;
    use raft::eraftpb::ConfState;
    use raft::storage::MemStorage;
    use raft::{prelude::*, StateRole};
    use regex::Regex;
    use crate::proposal::Proposal;
    use crate::{proposal, batch};
    use std::{str, thread};
    use std::time::{Instant, Duration};
    use crate::batch::Mailbox;
    
    pub struct Node {
        core: Arc<Mutex<CoreNode>>
    }
    
    #[derive(Copy)]
    struct CoreNode {
        raft_group: RawNode<MemStorage>,
    }
    
    
    impl Node {
        pub fn new() -> Self {
            let cfg = Config {
                election_tick: 10,
                heartbeat_tick: 3,
                ..Default::default()
            };
            let storage = MemStorage::new();
    
            let core = Arc::new(Mutex::new(CoreNode {
                raft_group: RawNode::new(&cfg, storage).unwrap()
            }));
    
            thread::spawn(move || {
                core.lock().unwrap().run();
                return;
            });
    
            Node { core: core.clone() }
        }
    
        pub fn is_leader(&self) -> bool {
            return self.core.lock().unwrap().raft_group.raft.state == StateRole::Leader;
    
        }
    }
    
    impl CoreNode {
        pub fn run(mut self) {}
    }
    

    编译时,出现以下错误:

    22 | #[derive(Copy)]
       |          ^^^^
    23 | struct CoreNode {
    24 |     raft_group: RawNode<MemStorage>,
       |     ------------------------------- this field does not implement `Copy`
       |
    

    我的问题是:我如何围绕这个问题进行设计。

    0 回复  |  直到 3 年前