首页 > 解决方案 > 为什么弧> 需要 T:同步 + 发送?

问题描述

如果我有一个在线程之间发送不安全的类型,我用Arc<Mutex<T>>. 这样我可以保证当我访问它时,我需要先解锁它。但是,Rust 仍然会抱怨 whenT没有实现Send + Sync.

它不应该适用于任何类型吗?在我的例子中,T是一个通过 FFI 访问 C 对象的结构,所以我不能将它标记为Sync + Send.

在这种情况下我能做什么,为什么 Rust 不接受Arc<Mutex<T>>线程之间共享的安全?

标签: rust

解决方案


仅仅因为你是唯一一个(一次)访问某些东西的人,并不意味着它突然变得可以从不同的线程访问东西。它只是防止了一个问题:数据竞争。但是跨线程移动对象可能还有其他问题。

例如,低级窗口 API 通常只能从主线程调用。许多低级 API 也只能从它们被初始化的线程调用。如果你将这些 API 包装在 Rust 对象中,那么无论如何你都不希望这些对象在线程间移动


推荐阅读