作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个需要Send + Sync
的结构:
struct Core {
machines_by_id: DashMap<String, StateMachineManager>,
}
在我当前的实现中,
StateMachineManager
看起来像这样:
struct StateMachineManager {
protected: Arc<Mutex<StateMachines>>,
}
只要
StateMachines
是
Send
,它就可以正常工作。但是,它不是必须的,它会使我想使用
Rc
的实现复杂化。
StateMachines
不能永远都驻留在一个线程上的原因,因此从理论上讲,它们没有必要成为
Send
-它们可以在专用于它们的线程上创建并存在于那里,直到不再需要为止。
StateMachines
的API,作为通过该 channel 来回发送的消息。我如何避免这样做,并告诉Rust我需要做的就是序列化对它们全部存在的线程的访问?
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/
我是一名优秀的程序员,十分优秀!