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)
这取决于您想用它做什么。例如,要将值存储到原子联合中:
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)
如果您希望能够对所包含的值执行无锁原子算术(例如原子增量),那么您将需要进行第二个设计(原子联合)。