2014-09-16 2 views
4

std :: atomic을 사용하여 유니온을 유니온으로 설정하는 방법은 무엇입니까? 아니면 노동 조합의 구성원이 대신 원자라고 선언해야합니까?C++ std :: atomic union

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; 

및 아래로 멤버 변수 값을 선언

foo->value.floatArray = NULL; 

error: no member named 'floatArray' in 'std::__1::atomic<ValueUnion>' 
        foo->value.floatArray = NULL; 

내가 뭔가를 할 필요가 있는가 : 노동 조합에

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

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

}; 

액세스 오류를 준다?

class FooClass { 
public: 
    ValueUnion value; 

}; 

답변

1

귀하가 원하는대로 다릅니다. 예를 들어, 원자 노동 조합에 값을 저장하기 :

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

또는 다음 포함 된 값에 잠금이없는 원자 연산 (예를 들어 원자 증가)을 수행 할 수있게하려면

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

당신은 두 번째 디자인 (atomics의 조합)에 갈 필요가있다.

2

난 당신이 원자 메모리 액세스를 사용해야하고 기록합니다 가정이이 load/modify/store 순서가 원자 것을 보증하지 않습니다

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); 
} 

통지있다. 해당 지침의 안전을 직접 처리해야합니다 (예 : mutex)