Я хочу сделать некоторую работу после всех вызванных деструкторов C ++ thread_local.
Это зависит от платформы — Android, поэтому у меня есть доступ к pthreads
,
Вопрос в том, когда pthread_key_create
Должны быть вызваны деструкторы, до или после C ++ thread_local
деструкторов? Или их можно чередовать?
Я тестировал на Linux Mint и pthread деструкторы, названные в честь C ++.
бионический / 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();
Тем не менее, это не задокументированное поведение, и вы не должны строить что-то, опираясь на это.
libstdc++
из GCC использует pthread_key_create
если платформа не обеспечивает __cxa_thread_atexit_impl
, В этом случае деструкторы C ++ выполняются где-то посередине деструкторов POSIX.
Насколько мне известно, нет стандарта, который требует какого-либо особого поведения здесь, потому что C ++ не знает о POSIX, а POSIX не знает о C ++, поэтому ни один из стандартов не говорит о том, что здесь происходит. Есть также несколько ключевых случаев, связанных с воскрешением локальных данных потока во время уничтожения потока, которые могут отличаться в разных реализациях. (Типичным примером является объект журнала для каждого потока, который используется для регистрации из деструкторов локальных переменных потока.)