2016-12-22 1 views
4

저는 지속적으로 실행중인 작업자 스레드가 있습니다.를 통해 관리되는 &이 생성되었습니다. 내 작업자 스레드의 최상위 수준에서 try/catch 블록 안에 while 루프가 있습니다. 예외가 스레드의 최상위 레벨을 통해 새어 경우에, 나는 그것을 잡을 또한 비 정적 스레드 기능을 소유 한 클래스의 구성원 인 std::exception_ptr,에 저장 :std :: exception_ptr 스레드는 안전합니까?

// In class header (inside class definition) 
std::exception_ptr m_threadException; 

// In class CPP file 
void MyClass::MyThreadFunction() 
{ 
    try { 
     while (true) { 
      // Do thread stuff 
     } 
    } 
    catch (std::exception const& e) { 
     m_threadException = std::current_exception(); 
    } 
} 

스레드 일단을 이런 종류의 예외로 인해 죽는다. (메인 쓰레드에서 주로 사용하는) 클래스는 아직 알지 못한다. 내 계획과 같이, 모든 클래스의 주요 기능의 시작 스레드 체크 포인트를 추가했다 :

void MyClass::SomethingMainThreadCalls() 
{ 
    if (m_threadException) { 
     std::rethrow_exception(m_threadException); 
     m_threadException = nullptr; // Somehow reset it back to null; not sure if this will work 
    } 

    // Do normal function stuff 
} 

이도 좋은 생각입니다 가정 내 주요 스레드가 exception_ptr 경우 확인시 사이에 가능한 경쟁 조건이있다 (SomethingMainThreadCalls()을 호출 할 때) null이고 작업자 스레드가 할당합니다. 나는 본질적으로 스레드 안전 (표준에 의해 보장)인지 또는이 경우 스레드 동기화를 담당하는지에 대한 정보 (C++ 11 초안을 아직 확인하지 못함)를 찾지 못했습니다.

후자의 경우 std::atomic을 사용하면 간단하게 유지할 수 있습니까? 예 :

std::atomic<std::exception_ptr> m_threadException; 

그런 식으로 뭔가요? 내 질문에 대한 대답은 여기에 모범 사례에 대한 좋은 권고 사항과 정보가 포함되기를 바랍니다. 미리 감사드립니다.

답변

3

표준에서 스레드 안전성과 관련하여 exception_ptr에 대한 특별한 언급은 없습니다. 따라서, 그것은 기본 표준 보증을 제공합니다 : 별도의 인스턴스에 액세스하는 것은 괜찮습니다. 동일한 인스턴스에 액세스하는 것은 아닙니다.

다른 코드에 exception_ptr이 설정되었음을 알리기 위해 atomic<exception_ptr> 대신 atomic<bool>을 사용하는 것이 좋습니다. 당신은 너무 오래로 괜찮을거야 : 깃발을 설정 전에

  1. 당신은 m_threadException을 설정
  2. m_threadException
  3. 당신은 설정하는 적절한로드/저장 메모리 명령을 사용하는 플래그를 확인 후/플래그를 확인하십시오. 기본값은 괜찮습니다.
  4. 정확히 m_threadException이라고 쓰십시오.
+0

이것은 좋은 생각입니다. 또한 exception_ptr을 null로 설정할 필요가 없습니다. cppreference.com에 따르면'exception_ptr'에 대한 문서화 된 인터페이스가 없으므로'nullptr '에 대한 대입 연산자가 있는지 확실하지 않습니다. –

+3

@ void.pointer : "문서화 된 인터페이스"를 가지고 있습니다. 사이트 [http://en.cppreference.com/w/cpp/error/exception_ptr]에서 "std :: exception_ptr"은 [NullablePointer] (http : // en. cppreference.com/w/cpp/concept/NullablePointer)."심지어 기본 및 복사 생성자가 수행하는 작업에 대해 설명합니다. 비교 연산자뿐만 아니라 –

+0

죄송합니다. 터널 비전. 해당 페이지에서 실제 인터페이스 사양을 기대하고 있습니다. 일반적으로 cppreference.com은 다른 클래스 유형과 비슷합니다. 감사합니다. –

2

표준에서는 std::exception_ptr의 구현을 지정하지 않으므로 std::exception_ptr의 스레드 안전성도 지정되지 않았습니다.

그냥 자물쇠가있는 예외 포인터를 감싸면 코드가 정상적으로 작동합니다.

관련 문제