2015-01-06 4 views
1

나는 원자 컨테이너에 몇 가지 문제를 겪고 있었고 this link을 보았습니다.C++ 11 std :: thread의 스레드 안전성 <T> 복사 생성자

std :: atomic이 복사 생성 가능하지 않은 이유가 있습니까? 솔루션은 this 인 것 같습니다. 원자로드 함수를 사용하여 비 원자 생성자에 T 값을 전달합니다 (실수하지 않은 경우).

일반적으로이 복사본 생성자는 안전합니까?

template<typename T> 
struct MobileAtomic 
{ 
    std::atomic<T> atomic; 

    explicit MobileAtomic(std::atomic<T> const& a) : atomic(a.load()) {} 

}; 
+0

이 코드가 의미있는 것을 달성하는지 여부는 분명하지 않습니다. Atomics는 매우 구체적인 용도로 사용되며 일반적으로 복사하는 것이 적절하지 않습니다. –

+1

유추 : 원자 int는 정수보다 뮤텍스 또는 세마포에 훨씬 가깝습니다. 세마포어의 현재 상태 (원자 적로드에 해당)를 질의 할 수는 있지만 세마포어 자체를 복사하는 것은 의미가 없습니다. 이것은 동기화 메커니즘이며 합리적인 것이 아니라면 복사본을 만듭니다. –

+2

"생성자가 스레드로부터 안전하다는"의미는 무엇인지 분명하지 않습니다. 누가 공유 방식으로 무엇을 구성하고 있습니까? –

답변

4

이유 표준 : 원자 이유가 복사 constructable가되지 않는가요?

.

복사본 구성 가능 문자 atomic을 요청할 때 단일 스레드 순차 일관성의 "일반"규칙을 사용하여 해당 규칙을 따르지 않는 변수에 적용하도록 요청합니다.

본질적으로 일반화 된 솔루션이 없습니다.

질문에 표시되는 생성자를 사용하면 생성이 완료된 후에 원본 개체와 대상 개체가 동일하다는 보장이 없다는 점에서 결정적인 결과를 희생합니다.

+0

나에게는 두 가지 옵션이있다 : 나는 원자 변수의 값을 값 (호출자 = 레이스에 의해 값이 할당 될 때까지 다른 스레드에 의해 변경 될 수 있음)으로 반환하거나 원자 변수에 대한 참조를 반환 할 수만있다. (내가 노출하고 싶지 않은 변수입니다). 최선의 방법은 아직 시도하지 않은 const 참조를 반환하는 것입니다. – JohnJohn

+0

@JohnJohn 또 다른 옵션은 독서 기간 동안 뮤텍스로 변수를 잠그는 것입니다. –

+1

@ 존린 : 당신이 그것을 깨닫지는 못하지만, ** 복사본을 만들 자마자 원래의 객체의 값은 사본의 값과 다를 수 있습니다. 그것은 경쟁 조건이 아닙니다. 두 가지 변수가있을 때 정상적인 동작입니다. 논리적으로 하나의 값을 갖는다면 하나의 객체를 가져야합니다. – MSalters