2016-12-23 10 views
4

std::atomic 보면 그것은 기본 전문 내가 읽을 수있다 :std :: atomic 내장 형식 - 비 잠금 장치 대 사소한 소멸자?

이 전문 표준 레이아웃을 가지고 사소한 기본 생성자사소한 소멸자.

는 또한 is_lock_free에 대한 읽기 : std::atomic_flag제외

모든 원자 유형은 뮤텍스 또는 다른 잠금 작업을 사용하는 대신 잠금이없는 원자 CPU 명령어를 사용하여 구현 될 수있다. 원자 유형도 가끔 허용 될 수 있습니다. lock-free. 정렬 된 메모리 액세스 만 주어진 아키텍처에서 원자 번호가 인 경우 동일한 유형의 정렬되지 않은 객체는 잠금을 사용해야합니다.

지금 여기에 내가하지 않는 캐치 :

어떻게 표준 적 뮤텍스의 모든 종류의 사용할 사소한 ctor에/dtor 규정 어떤 atomic 유형 - 내가 온 모든 뮤텍스 가로 질러야 함 사소한 초기화.

이 다음 질문에 리드 :

  • 하는 주요 플랫폼은 개체 당 "initalization 무료"입니다 (뮤텍스 같은) 어떤 잠금 동작을 제공 마십시오.
  • std::atomic 특수화가 잠긴 상태가 아니며 (여전히 평범한 ctor/dtor 요구 사항을 충족 함) 알려진 구현이 있습니까?
  • 여기에 뭔가 혼동하는 것이 있습니까? :-)

심지어 가장 간단한 스핀 록 (atomic_flag 참조)도 간단한 구현이 필요하므로 어떻게 구현할 수 있는지 알 수 없습니다.

면책 조항 : 분명히 학문적 관심사에서 벗어나이 문서를 읽는 동안 나에게 뛰어 들었습니다.

답변

4

다음과 같은 가능한 해결책이 있습니다. 원자 연산이 잠금을 사용하지만 사소한 생성자 및 소멸자가있는 경우 뮤텍스는 많은 원자 값간에 공유되는 전역 뮤텍스 일 수 있습니다.

저는 이것이 표준 작성자가 허용 한 사례라고 생각합니다. 일반적인 플랫폼 (예 : POSIX)에서는 정적 지속 기간이있는 뮤텍스에 대해 사소한 생성자 및 소멸자를 사용할 수 있습니다. std::atomic 기본 생성자가 아닌 사소한 것이 허용되었다

// This is copied plain C here, not C++ 
// So nothing fancy 
#include <pthread.h> 
pthread_mutex_t my_mutex = PTHREAD_MUTEX_INITIALIZER; 

경우 다음 초기화하는 동안 그것들을 사용하기 어렵다.my_flag는 사소한 생성자가 있으므로

std::atomic<int> my_flag; 

, 그것을 정적 초기화된다. 정적 초기화는 동적 초기화 전에 발생합니다. 따라서 모든 글로벌 std::atomic 변수는 생성자가 실행되기 전에 초기화됩니다.

+0

하! 네, 이것이 표준 요구 사항을 충족시키는 것 같습니다. 비록 대부분의 실제 사용 사례에 대해 다소 정신 나간 것 같습니다! –

+0

예, 제정신이 아닙니다. 그러나 사람들은 미친 아키텍처에서 작동하는 C++ 코드를 작성하려고하며 표준 작성자는이를 기꺼이 요구합니다. –

+0

Wrt. 편집 : 코드는 (정적) 객체를 값으로 설정하므로 * 사소한 * 초기화가 아닙니다. (?) 물론, 이것을 사용하는 객체는 아무 것도 할 필요가 없으므로 사소한 ctor를 가질 수 있습니다. –