2016-11-18 8 views
1

원자의 배열 즉 원자가 각각 n 개의 정수를 생성해야합니다. 나는 std::vector<std::atomic<int>>이 작동하지 않을 것이라는 것을 알았지 만, 다음 접근법을 시도하고 clang으로 성공적으로 컴파일됩니다.C++에서 이중 포인터를 사용하여 원자 단위의 동적 배열을 선언하는 것이 맞습니까?

이 작업이 올바른지 확실하지 않습니까? 또한, 여기에 모든 a[i][0]이 원자 단위인지 확인하는 방법이 있습니까 (다중 스레드로 검사하는 경우 제외)?

+3

'std :: vector >가 작동하지 않습니다. ' 너 무슨 짓을 한거야? 'std :: vector > a (n);'매우 효과적입니다. –

+0

''[a [i] [0]'가 모두 원자인지 아닌지 확인하는 것입니다. 그들의 타입은'std :: atomic '입니다. 당신이 알아야 할 또 다른 것이 있습니까? –

+0

'std :: vector >'에서'resize()'를 호출하려했는데 그 문제가 발생했습니다. 하지만 네, 완벽하게 작동합니다, 고마워요. –

답변

1

코드가 정확합니다 (리소스 누출을 제외하고 간단히하기 위해 배열을 삭제하는 것은 생략 된 것으로 가정 함). 그러나 복잡합니다. 우선, 왜 "이중 포인터"또는 포인터에 대한 포인터를 사용합니까? 왜이 :

std::atomic<int> * a1 = new std::atomic<int>[ n ]; 

std::vector<std::atomic<int>> a2(n); 

몇 가지 차이점이 있습니다, 너무 작업을해야 다음, 당신을 위해 작동하지만, 가장 중요한 하나가 아마도 경우 당신이 값으로 a1을 전달하면, 내용은 복사되지 않지만, 값으로 a2을 전달하면됩니다.

std::atomic을 복사 할 수 없기 때문에 문제가 될 수 있습니다. 소유권을 이전해야하는 경우를 제외하고 항상 a2을 참조로 전달해야합니다. 이 경우 std::move 및 rvalue 참조를 사용하십시오. 값으로 a2을 전달할 수 없습니다.