我希望在调用所有C ++ thread_local析构函数后做一些工作。
这是特定于平台的 - Android,因此我可以访问pthreads
。
问题是,在C ++ pthread_key_create
析构函数之前或之后应该调用thread_local
d析构函数?或者它们可以交错?
我测试了Linux Mint和pthread在C ++之后调用的析构函数。
答案 0 :(得分: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();
但是,这不是记录在案的行为,您不应该构建依赖它的东西。
答案 1 :(得分:0)
libstdc++
,来自GCC的 pthread_key_create
会使用__cxa_thread_atexit_impl
。在这种情况下,C ++析构函数在POSIX析构函数的中间运行。
据我所知,没有标准需要任何特定的行为,因为C ++不知道POSIX和POSIX不了解C ++,所以这两个标准都没有说明。还有一些涉及线程破坏期间线程局部数据复活的极端情况,这些情况因实现而异。 (一个典型的例子是每线程记录器对象,用于记录线程局部变量的析构函数。)