2017-11-11 8 views
0

모든 C++ thread_local 소멸자가 호출 된 후에 일부 작업을 수행하려고합니다. 플랫폼에 따라 다릅니다 - Android이므로 pthreads에 액세스 할 수 있습니다.pthread 소멸자가있는 C++ thread_local 소멸자

질문 : pthread_key_create 소멸자가 C++ thread_local 소멸자 전후에 호출되어야 할 때입니까? 아니면 인터리브 할 수 있습니까?

필자는 C++ 이후에 호출 된 Linux Mint 및 pthread 소멸자에 대해 테스트했습니다.

+0

thread_local이 pthread_key_create 측면에서 구현되었다고 생각됩니다. –

+0

@RichardHodges 나는 그것도 처음에 기대한다 ... 그러나! pthread_key_create 파기 순서는 정의되어 있지 않습니다. C++ thread_local 소멸자가 필요합니다. 그들은 단지 순수한 pthread 일 수 없습니다. 그래서, 그들은 인터리브 될 수 없습니다 ... 따라서 - 그들은 모두 이전이나 이후에 호출됩니다 ... – tower120

+0

사실 godbolt에서 놀아 보면 실제로 gcc가 thread_specific 데이터를 추적하기 위해 레지스터를 사용하는 것으로 보입니다. –

답변

1

bionic/pthread_exit.cpp은 동일한 순서로 갖는다 : 그러나

void pthread_exit(void* return_value) { 
    // Call dtors for thread_local objects first. 
    __cxa_thread_finalize(); 
    // Call the TLS destructors. 
    pthread_key_clean_all(); 

을이 설명하지 않은 문제 당신은 그것에 의존하는 무언가를 세워서는 안됩니다.

+0

https://stackoverflow.com/a/47237684/1559666과 같이 pthread 소멸자에서 pthread 소멸자를 다시 등록하려면 어떻게해야합니까? 설명서에 따르면 소멸자의 호출 순서는 정의되어 있지 않지만 반복으로 진행될 것이라고합니다. C++ thread_local 소멸자는 자기 (표준 동작)를 다시 등록 할 수 없으므로 한 번 건너 뛰면 두 번째 반복에서 우리는 반드시 실행해야합니다 C++ 이후. 권리? – tower120

+1

@ tower120 C++ thread_local이 pthread 소멸자를 사용하지 않는다면 보장 할 수는 없습니다. – ephemient

+0

음 ... 사실 ... – tower120

0

libstdc++ (GCC에서 제공)은 플랫폼이 __cxa_thread_atexit_impl을 제공하지 않을 경우 pthread_key_create을 사용합니다. 이 경우 C++ 소멸자는 POSIX 소멸자의 중간에서 실행됩니다.

C++은 POSIX에 대해 모르고 POSIX는 C++에 대해 알지 못하기 때문에 여기서는 특별한 동작이 필요없는 표준이 없으므로 어느 표준도 여기에서 어떤 일이 발생하는지 말하지 않습니다. 또한 스레드 소멸 중 스레드 로컬 데이터의 부활과 관련된 몇 가지 모서리 사례가 구현 중에 다양합니다. (A 전형적인 예는 스레드 로컬 변수 소멸자에서 기록에 사용되는 쓰레드 당 로거 목적이다.)