2014-09-16 6 views
4

Как установить объединение в атомарное с помощью std :: atomic? Или я должен объявить членов союза атомарным вместо этого?C++ std :: atomic union

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

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

}; 

Доступ к объединению дает ошибку:

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; 

мне нужно сделать что-то подобное делать?

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

Если вы хотите, чтобы иметь возможность выполнять безблокировочную атомную арифметику (например, атомен инкрементом) на содержащихся значений, то вам нужно будет пойти на второй дизайн (объединение атомистики).

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)

Смежные вопросы