gpt4 book ai didi

multithreading - 类似于线程安全映射的对仅在一个线程上存在的值的访问

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

我有一个需要Send + Sync的结构:

struct Core {
machines_by_id: DashMap<String, StateMachineManager>,
}
在我当前的实现中, StateMachineManager看起来像这样:
struct StateMachineManager {
protected: Arc<Mutex<StateMachines>>,
}
只要 StateMachinesSend,它就可以正常工作。但是,它不是必须的,它会使我想使用 Rc的实现复杂化。
从性能角度来看,没有所有的 StateMachines不能永远都驻留在一个线程上的原因,因此从理论上讲,它们没有必要成为 Send-它们可以在专用于它们的线程上创建并存在于那里,直到不再需要为止。
我知道我可以使用 channel 来做到这一点,但这似乎意味着要重新创建 StateMachines的API,作为通过该 channel 来回发送的消息。我如何避免这样做,并告诉Rust我需要做的就是序列化对它们全部存在的线程的访问?
Here是一个最小的示例(我在shepmaster的注释中添加了 Send + Sync界限,省略了它们)– DashMap是线程安全的映射。

最佳答案

我最终在这里所做的是使用 channel ,但是我能够找到一种方法来避免需要重新创建StateMachines的API。
该技术是使用 channel 将闭包传递给StateMachines实例所在的专用线程,该线程接受&mut StateMachines参数,并将响应向下发送回另一个 channel ,该 channel 在进行访问时位于堆栈中。
这是一个实现关键部分的游乐场
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=e07972b928d0f0b7680b1e5a988dae84
省略了在专用线程上实例化计算机的详细信息。

关于multithreading - 类似于线程安全映射的对仅在一个线程上存在的值的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66234781/

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