2017-12-19 33 views
0

더블 :<double> 내가 두 값을 추가 할

auto size = new std::atomic<double>(0); 
double packet_size = 64e3; 
*size += packet_size; 

을하지만이 오류가 발생했습니다.

no match for ‘operator+=’ (operand types are ‘std::atomic<double>’ and ‘double’) 

어떻게이 두 숫자를 올바르게 추가해야합니까?

+3

'std :: 원자 '은 C++ 20까지 표시되지 않습니다. 그것을 지원하는 컴파일러가 있습니까? – DeiDei

+0

@DeiDei; 심지어 불평하지 ... http://coliru.stacked-crooked.com/a/24b749dce3f8d705 – user1810087

+0

당신은이 답변을 볼 수 있습니다 https://stackoverflow.com/questions/23116279/how-to-perform-basic- operation-with-the-not-integral-when-type-is-not-integral –

답변

0

atomic<float>atomic<double>을 생성 할 수 있지만 원자 단위 연산자는 부동 소수점 atomics에 정의되어 있지 않습니다. 이는 원자 적으로 부동 소수점 값을 추가하는 x86 (또는 ARM) 어셈블리 명령어가 없기 때문입니다.

해결 방법은 compare_exchange 연산을 사용하여 원자 변수를 증가/변경하는 것입니다.

#include <atomic> 

int main() 
{ 
    std::atomic<int> i{}; 
    i += 3; 

    std::atomic<double> f{}; 
    for (double g = f; !f.compare_exchange_strong(g, g + 1.0);) 
     ; 
    return 0; 
}