2

使用std::atomic,似乎没有符合标准的方式来有时在没有原子性的情况下读/写。Boost 具有互锁操作,但它们在details命名空间中,所以我认为我不应该使用它。但我不知道所有的提升。我可以使用 boost 或 stl 中的某些东西吗?或者可能是一个可以解决这个问题的提案,比如添加一个std::memory_order_no_synchronization? 或者访问联锁机制的抽象?

似乎在许多设计中都会出现这种需求。需要线程安全的对象可能会暂时保存在单线程上下文中,从而使原子访问变得多余。例如,当第一次构造一个对象时,它通常只在创建它的线程上可见,直到放置在多个线程可以访问的某个地方。只要您的对象只能由单个线程访问,您就根本不需要std::atomic' 安全性。但是一旦准备好,你就会将它发布到其他线程,突然你需要锁定和强制原子访问。

在这个特定的应用程序中,我正在构建大型无锁树。在构建过程中,对 interlocked 的需求为零,因此现有设计(称为 os-provided interlocked 函数)在需要时才使用 interlocked。在它对其他线程可见后,所有线程都应该使用互锁视图。std::atomic如果不引入一堆毫无意义的同步,我就无法移植。

我现在能想到的最好的方法就是使用std::memory_order_relaxed,但是在 ARM 上,这仍然与非原子访问不同。在 x86/amd64 上是这样。另一个技巧是placement new on std::atomic,它写入一个没有原子性的新值,但这并没有提供任何非原子读回值的方法。

4

0 回答 0