带有pthread析构函数的c ++ thread_local析构函数

时间:2017-11-11 08:49:04

标签: android c++ linux pthreads thread-local-storage

我希望在调用所有C ++ thread_local析构函数后做一些工作。 这是特定于平台的 - Android,因此我可以访问pthreads

问题是,在C ++ pthread_key_create析构函数之前或之后应该调用thread_local d析构函数?或者它们可以交错?

我测试了Linux Mint和pthread在C ++之后调用的析构函数。

2 个答案:

答案 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 ++,所以这两个标准都没有说明。还有一些涉及线程破坏期间线程局部数据复活的极端情况,这些情况因实现而异。 (一个典型的例子是每线程记录器对象,用于记录线程局部变量的析构函数。)