首页 > 解决方案 > 两个高性能结构之间的循环引用

问题描述

我有两个结构NodeCommunicator. Node包含“业务逻辑”,同时Communicator包含发送和接收 UDP 消息的方法。当它想要发送消息时Node需要调用方法,当它接收到UDP消息时需要调用方法。如果它们是相同的结构,则完全没有问题。但我想将它们分开,因为它们显然有不同的职责。将所有内容都放在一个结构中将变得难以管理。我的代码如下所示:CommunicatorCommunicatorNode

fn main() {
    use std::sync::{Arc, Mutex, Condvar, Weak};
    use std::thread;


    pub struct Node {
        communicator: Option<Arc<Communicator>>
    }

    impl Node {
        pub fn new() -> Node {
            Node {
                communicator: None
            }
        }

        pub fn set_communicator(&mut self, communicator: Arc<Communicator>) {
            self.communicator = Some(communicator);
        }
    }

    pub struct Communicator {
        node: Option<Weak<Node>>
    }

    impl Communicator {
        pub fn new() -> Communicator {
            Communicator {
                node: None
            }
        }

        pub fn set_node(&mut self, node: Weak<Node>) {
            self.node = Some(node);
        }
    }



    let mut my_node = Arc::new(Node::new());
    let mut my_communicator = Arc::new(Communicator::new());

    Arc::get_mut(&mut my_node).unwrap().set_communicator(Arc::clone(&my_communicator));

    //Arc::get_mut(&mut my_communicator).unwrap().set_node(Arc::downgrade(&my_node));
}

如我所料,如果我取消注释最后两行,我的代码就会崩溃。但这是我想要实现的目标。

我看到了几个选项:

理论上我可以分成CommunicatoraSender和 a Receiver,这样就不会有循环引用。但是对于我的程序,我知道我将来会遇到类似的情况,这是不可能的。

似乎由于我只是将一个结构分成两部分,出于代码结构的原因,并且没有获得新功能,所以应该有一种方法可以做到这一点,而不必支付任何性能损失Mutex

标签: rustcyclic-reference

解决方案


推荐阅读