C ++ std :: atomic联合

Joh*_*ohn 5 c++ atomic stdatomic

如何使用std :: atomic将并集设置为atomic?还是我必须声明工会的成员是原子的?

typedef union {
    int integer;
    float flt;
    double dbl;
    int *intArray;
    float *floatArray;
    unsigned char *byteArray;
} ValueUnion;

class FooClass {
public:
    std::atomic<ValueUnion> value;

}; 
Run Code Online (Sandbox Code Playgroud)

访问联合会出现错误:

foo->value.floatArray = NULL;

error: no member named 'floatArray' in 'std::__1::atomic<ValueUnion>'
                    foo->value.floatArray = NULL;
Run Code Online (Sandbox Code Playgroud)

我需要做类似的事情吗?

typedef union {
    std::atomic<int> integer;
    std::atomic<float> flt;
    std::atomic<double> dbl;
    std::atomic<int*> *intArray;
    std::atomic<float*> *floatArray;
    std::atomic<unsigned char*> *byteArray;
} ValueUnion;
Run Code Online (Sandbox Code Playgroud)

并声明成员变量值如下?

class FooClass {
public:
    ValueUnion value;

}; 
Run Code Online (Sandbox Code Playgroud)

eca*_*mur 2

这取决于您想用它做什么。例如,要将值存储到原子联合中:

foo->value = []{ ValueUnion u; u.floatArray = NULL; return u; }();
Run Code Online (Sandbox Code Playgroud)

或者

foo->value.store([]{ ValueUnion u; u.floatArray = NULL; return u; }());
Run Code Online (Sandbox Code Playgroud)

如果您希望能够对所包含的值执行无锁原子算术(例如原子增量),那么您将需要进行第二个设计(原子联合)。