簡體   English   中英

C ++ std :: atomic聯合

[英]C++ std::atomic union

如何使用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;

}; 

訪問聯合會出現錯誤:

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;

}; 

我想您必須使用原子內存訪問並編寫:

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序列是原子的。 您必須自己處理這些說明的安全性(例如互斥體

這取決於您要如何處理。 例如,要將值存儲到原子聯合中:

foo->value = []{ ValueUnion u; u.floatArray = NULL; return u; }();

要么

foo->value.store([]{ ValueUnion u; u.floatArray = NULL; return u; }());

如果您希望能夠對所包含的值執行無鎖原子算術(例如原子增量),那么您將需要進行第二個設計(原子的並集)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM