“可撕裂的双关语,以及更糟糕的想法:一个最小线程安全的单元格

主要观点:介绍了tearor::TearCell类型,它是一个“线程安全”的单元格,将数据竞争降级为数据损坏,通过将内部UnsafeCell中的数据解释为&[AtomicU8]来实现线程安全,虽有风险但仍可在一定程度上忽略线程安全问题;给出了TearCell的实现代码,包括读取load和写入store操作,都使用了Relaxed顺序且基于bytemuck::Pod;强调该代码虽有趣但可能并非对所有人有用且有一定风险,真实的 crate 更高效且稍少可疑。

关键信息:

  • TearCell通过将数据视为&[AtomicU8]实现线程安全,虽数据访问本质上是非原子的但使用Relaxed顺序。
  • 实现中使用bytemuck库,Pod类型有严格要求,如无填充字节、无未初始化字节等。
  • load操作创建目标T,获取其字节,通过atom_slice获取源字节并逐个初始化。
  • store操作获取值的字节和atom_slice,逐个将数据复制到原子中。

重要细节:

  • 真实代码在处理较大结构时会使用更大的原子操作,目前size_of使用受限所以通过转换&core::cell::UnsafeCell<T>来实现。
  • 对于内部填充字节和repr(Rust)结构是否可用于TearCell存在疑问但要求Pod可使验证更简单。
  • 作者不认为该代码会对所有人有用且强调使用时应充分意识到可能的错误。
阅读 10
0 条评论