对仅存在于一个线程中的值进行线程安全映射式访问
Threadsafe map-like access to values that only ever exist on one thread
我有一个结构需要 Send + Sync
:
struct Core {
machines_by_id: DashMap<String, StateMachineManager>,
}
在我当前的实现中,StateMachineManager
看起来像这样:
struct StateMachineManager {
protected: Arc<Mutex<StateMachines>>,
}
只要 StateMachines
是 Send
,这就可以正常工作。但是,它不需要,并且它使我想使用 Rc
.
的实现变得复杂
性能方面,没有理由所有 StateMachines
不能永远存在于一个线程上,所以理论上它们没有理由需要 Send
- 它们可以在一个线程上创建献给他们并住在那里直到不再需要。
我知道我可以通过频道做到这一点,但这似乎意味着重新创建 StateMachines
的 API 作为通过该频道来回发送的消息。我怎样才能避免这样做,并告诉 Rust 我需要做的就是序列化对它们所处线程的访问?
Here is a minimal example (where I have added the Send + Sync
bounds to Shepmaster's comment which omitted them) -- DashMap 是线程安全映射。
我最终在这里做的是使用频道,但我找到了一种方法来避免需要重新创建 StateMachines
的 API。
该技术是使用通道将闭包传递给专用线程,StateMachines
个实例存在于该线程上,该线程接受 &mut StateMachines
参数,并将响应发送回另一个通道,该通道存在在访问发生时在堆栈上。
这是实现关键部分的游乐场
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=e07972b928d0f0b7680b1e5a988dae84
省略了在专用线程上实例化机器的详细信息。
我有一个结构需要 Send + Sync
:
struct Core {
machines_by_id: DashMap<String, StateMachineManager>,
}
在我当前的实现中,StateMachineManager
看起来像这样:
struct StateMachineManager {
protected: Arc<Mutex<StateMachines>>,
}
只要 StateMachines
是 Send
,这就可以正常工作。但是,它不需要,并且它使我想使用 Rc
.
性能方面,没有理由所有 StateMachines
不能永远存在于一个线程上,所以理论上它们没有理由需要 Send
- 它们可以在一个线程上创建献给他们并住在那里直到不再需要。
我知道我可以通过频道做到这一点,但这似乎意味着重新创建 StateMachines
的 API 作为通过该频道来回发送的消息。我怎样才能避免这样做,并告诉 Rust 我需要做的就是序列化对它们所处线程的访问?
Here is a minimal example (where I have added the Send + Sync
bounds to Shepmaster's comment which omitted them) -- DashMap 是线程安全映射。
我最终在这里做的是使用频道,但我找到了一种方法来避免需要重新创建 StateMachines
的 API。
该技术是使用通道将闭包传递给专用线程,StateMachines
个实例存在于该线程上,该线程接受 &mut StateMachines
参数,并将响应发送回另一个通道,该通道存在在访问发生时在堆栈上。
这是实现关键部分的游乐场 https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=e07972b928d0f0b7680b1e5a988dae84
省略了在专用线程上实例化机器的详细信息。