我最近在尝试使用
RwLock
返回的“Lock Guards”创建并行系统时遇到了问题。由于我的系统的架构设计,我需要存储这些锁。令我惊讶的是,存储这些锁防护的类型未能实现 Send 特征,这促使我探索这些防护的源代码实现,果然,我发现了为这些类型实现的 !Send 特征。
我找不到任何可行的解释来解释为什么要为这些类型实现 !Send 特征。那么为什么这是 Rust 标准库中定义的行为呢?
(我的猜测是,RwLock 在其结构中使用了 sys::RwLock,它存储了 AtomicU32,它必须是线程本地状态,因为一般来说我们不能跨线程边界传输任何内容,这取决于线程本地状态生成锁的线程,但我又不太确定)
这是因为在常见平台上,必须在获取锁的同一线程上释放锁。由于 Rust 使用平台的同步原语,因此它必须遵守这一点。