对仅存在于一个线程中的值进行线程安全映射式访问

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>>,
}

只要 StateMachinesSend,这就可以正常工作。但是,它不需要,并且它使我想使用 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

省略了在专用线程上实例化机器的详细信息。