C++ 实现跨平台联锁选项的方法,也允许我选择绕过同步?

C++ 实现跨平台联锁选项的方法,也允许我选择绕过同步?,c++,stl,atomic,interlocked,c++17,C++,Stl,Atomic,Interlocked,C++17,使用std::atomic,似乎没有符合标准的方法来有时进行无原子性的读/写。Boost具有互锁操作,但它们位于详细信息名称空间中,因此我不认为应该使用它。但我并不完全了解boost。boost或stl中是否有我可以使用的东西?或者一个解决这个问题的方案,比如添加一个std::memory\u order\u no\u synchronization?或者访问联锁机械的抽象 似乎在许多设计中都会出现这种需求。需要线程安全性的对象可能暂时保存在单线程上下文中,这使得原子访问变得多余。例如,当第一次

使用
std::atomic
,似乎没有符合标准的方法来有时进行无原子性的读/写。Boost具有互锁操作,但它们位于
详细信息
名称空间中,因此我不认为应该使用它。但我并不完全了解boost。boost或stl中是否有我可以使用的东西?或者一个解决这个问题的方案,比如添加一个
std::memory\u order\u no\u synchronization
?或者访问联锁机械的抽象

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

在这个特殊的应用程序中,我正在构建大型无锁树。在施工期间,对联锁的需求为零,因此现有设计(调用os提供的联锁功能)在必要时才使用联锁。当它对其他线程可见后,所有线程都应该使用联锁视图。如果不引入一些毫无意义的同步,我就无法移植到
std::atomic


我现在能想到的最好的方法就是使用
std::memory\u order\u relaxed
,但在ARM上,这与非原子访问还是不一样的。但在x86/amd64上却是如此。另一种方法是在
std::atomic
上放置new,它编写一个没有原子性的新值,但它不提供任何非原子读回值的方法。

另一种可能的方法是将所有
std::atomic
对象放在
union
中,其结构包含相同的底层基元类型。由于两者都是标准布局,因此通过非
原子
结构访问
std::atomic
值是合法的(尽管我不能100%确定标准对
std::atomic
数据成员顺序的保证)。不幸的是,标准允许,
std::atomic
的大小可能不同于
T
。虽然在我使用的编译器上没有,但它仍然不符合标准。@VoidStar:这(可能)并不重要,因为您可以使用
static\u assert
来确保相同的大小。可以想象,它可能无法在某个平台上编译,但如果它确实编译了,您肯定会知道它的大小相同。