c++ thread_local 带有 pthread 析构函数的析构函数
c++ thread_local destructors with pthread destructors
我想在所有 C++ thread_local 析构函数调用之后做一些工作。
这是特定于平台的 - Android,所以我可以访问 pthreads
.
问题是,什么时候应该调用 pthread_key_create
d 析构函数,在 C++ thread_local
析构函数之前还是之后?或者它们可以交错?
我在 Linux 上测试了在 C++ 之后调用的 Mint 和 pthread 析构函数。
来自 GCC 的 libstdc++
使用 pthread_key_create
以防平台不提供 __cxa_thread_atexit_impl
。在这种情况下,C++ 析构函数 运行 在 POSIX 析构函数的中间某处。
据我所知,这里没有要求任何特定行为的标准,因为 C++ 不知道 POSIX 并且 POSIX 不知道 C++,所以两个标准都没有说明这里发生了什么。还有一些极端情况涉及线程销毁期间线程本地数据的复活,这将因实现而异。 (一个典型的例子是用于从线程局部变量的析构函数中记录日志的每线程记录器对象。)
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();
但是,这不是记录在案的行为,您不应该依赖它来构建某些东西。
我想在所有 C++ thread_local 析构函数调用之后做一些工作。
这是特定于平台的 - Android,所以我可以访问 pthreads
.
问题是,什么时候应该调用 pthread_key_create
d 析构函数,在 C++ thread_local
析构函数之前还是之后?或者它们可以交错?
我在 Linux 上测试了在 C++ 之后调用的 Mint 和 pthread 析构函数。
libstdc++
使用 pthread_key_create
以防平台不提供 __cxa_thread_atexit_impl
。在这种情况下,C++ 析构函数 运行 在 POSIX 析构函数的中间某处。
据我所知,这里没有要求任何特定行为的标准,因为 C++ 不知道 POSIX 并且 POSIX 不知道 C++,所以两个标准都没有说明这里发生了什么。还有一些极端情况涉及线程销毁期间线程本地数据的复活,这将因实现而异。 (一个典型的例子是用于从线程局部变量的析构函数中记录日志的每线程记录器对象。)
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();
但是,这不是记录在案的行为,您不应该依赖它来构建某些东西。