自动更新结构的两个成员的最佳方法?

use*_*112 7 c++ atomic c++11

我有一个包含两个数据成员的结构:

struct A{
    short b;
    short c;
};
Run Code Online (Sandbox Code Playgroud)

以及包含许多这些struct对象的向量:

std::vector<A> vec;
Run Code Online (Sandbox Code Playgroud)

在运行时,数据成员A.bA.cstruct对象设置为零/值x.然而,bc必须在相同的时间-一个不能在没有其他分别更新修改.我正计划使用原子compare_exchange_weak()来进行更新.

我不确定我是否应该将每个结构体表示为std::atomic<A>向量中,或者我是否应该在结构中放置一个联合,将两个短路组合成一个uint32_t然后修改它:

union A {
    struct {
         short b;
         short c;
    };

    uint32_t d;
};
Run Code Online (Sandbox Code Playgroud)

什么是最好的解决方案?我应该存储以下矢量:

std::vector<uint32_t>
Run Code Online (Sandbox Code Playgroud)

并且在访问每个元素时,reinterpret_cast到A,以获得d

我希望锁定尽可能地最少侵入.

不需要可移植性,这将在Linux,64位,x86,GCC 4.8+编译器上

Bog*_* V. 2

我建议将变量包装在一个类中,并使用由互斥锁保护的 getter 和 setter,并将变量设置为私有。

使用联合可能会导致基于机器架构和编译器标志的不可预见的功能。

编辑 运行存储给定结构类型值的简单程序的结果(Linux 32位,x86):

  • 简单存储(完全没有保护)->~4000 us
  • 互斥锁保护存储 -> ~12000 us
  • 使用具有原子聚合字段的联合 -> ~21000 us