如何使用std :: atomic将联合设置为原子?或者我必须声明联盟的成员是原子的吗?
typedef union {
int integer;
float flt;
double dbl;
int *intArray;
float *floatArray;
unsigned char *byteArray;
} ValueUnion;
class FooClass {
public:
std::atomic<ValueUnion> value;
};
访问联合会出错:
foo->value.floatArray = NULL;
error: no member named 'floatArray' in 'std::__1::atomic<ValueUnion>'
foo->value.floatArray = NULL;
我是否需要做以下事情:
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;
并声明成员变量值如下所示?
class FooClass {
public:
ValueUnion value;
};
答案 0 :(得分:2)
我想你必须使用原子内存访问并写入:
typedef union {
int integer;
float flt;
double dbl;
int *intArray;
float *floatArray;
unsigned char *byteArray;
} ValueUnion;
class FooClass {
public:
std::atomic<ValueUnion> value;
};
int main()
{
FooClass obj;
ValueUnion temp = obj.value.load();
temp.floatArray = NULL;
obj.value.store(temp);
}
请注意,这并不能保证load/modify/store
序列是原子的。您必须自己处理这些说明的安全性(例如mutex)
答案 1 :(得分:1)
这取决于你想用它做什么。例如,要将值存储到原子联合中:
foo->value = []{ ValueUnion u; u.floatArray = NULL; return u; }();
或
foo->value.store([]{ ValueUnion u; u.floatArray = NULL; return u; }());
如果您希望能够对包含的值执行无锁原子算术(例如原子增量),那么您将需要进行第二次设计(原子的联合)。