2012-06-13 3 views
1

Java 라이브러리의 C++ 포트에서 작업 중입니다. 문제 중 하나는 Java의 AtomicLongArray에 해당하는 것을 찾을 수 없다는 것입니다. C++ 11에서 이미 동등한 것이 있거나 비슷한 기능을 구현하는 방법이 있다면 누구나 알고 있습니까? C++ 11 원자를 보았지만 아무것도 찾을 수 없었습니다. AtomicLongArray위한C++ Java atomiclongarray의 11 equivalent

+6

원자력 어레인지 (atomiclongarray)에 대해 설명하면 잠재적으로 유용한 잠재 고객을 크게 늘릴 수 있습니다. 그렇게하면 C++을 알고 있지만 Java는 아는 사람들로부터 도움을받을 수 있습니다. –

답변

8

워드 프로세서 말 :

요소 원자 적으로 갱신 될 수있는 긴 배열. 원자 변수의 특성에 대한 설명은 java.util.concurrent.atomic 패키지 스펙을 참조하십시오. std::atomic<long>의 간단한 배열처럼 나에게 소리

: 요소 만이 원자입니다

std::array<std::atomic<long>, N> array; 
// or, if size is not known at compile time 
std::vector<std::atomic<long>> vector(n); 

주, 컨테이너 자체는 아니므로, 벡터에 보내고 주변 push_back 가지 마세요 . 에서는

+0

질문 : 어떻게 원자 배열을 초기화하겠습니까? 그렇지 않으면 완전히 쓸모가 없습니다. – Pippo

+0

@Pippo는 다른 배열과 같습니다. –

+0

어, 작동하지 않습니다. http://stackoverflow.com/questions/19434787/c-how-to-initialise-an-array-of-atomics – Pippo

0

는 [container.requirements.dataraces] 표준 말한다

-2- (17.6.5.9) 구현은 데이터 레이스를 방지 할 필요에도 불구 때 다른 요소에 포함되는 오브젝트의 내용 vector<bool>을 제외한 동일한 순서가 동시에 수정됩니다.

-3- [참고 동시에 실행할 초과 한 x[1] = 5*x.begin() = 10는 데이터 경쟁없이 동시에 수행 될 수 있지만, x[0] = 5*x.begin() = 10는 데이터 레이스 초래할 수있는 크기의 용 vector<int> x. 일반적인 규칙의 예외로 vector<bool> y, y[0] = truey[1] = true과 경쟁 할 수 있습니다. -end 참고]

그래서 (악 vector<bool> 제외) 컨테이너는 별도 요소 데이터 레이스없이 갱신 될 수있다. 단일 요소에 대한 업데이트가 안전하도록하려면 원자 유형의 컨테이너 (예 : std::vector<std::atomic<long>>

+0

복사 생성자가 없으므로 마지막으로 원자형 벡터를 가질 수 없습니다. http://stackoverflow.com/questions/12003024/error-with-copy-constructor-assignment-operator-for-a-class-which-has-stdatomi –

+1

@SeanMcCauliff를 참조하십시오. 사실이 아니므로 신고 할 수 있습니다. 'std :: vector > v (10);'그냥 복사하거나 더 많은 요소를 삽입 할 수 없습니다. –

+0

// 다음 프로그램은 gcc 4.7.2와 호환 될 때 500 줄 이상의 오류 메시지를 생성합니다. 이것은 gcc에서 구현되지 않은 기능입니까? #include # 포함 using namespace std; int main (int argc, char ** argv) { 벡터 > atomVector (10); return 0; } –