The pthread_key_create() and __nptl_deallocate_tsd() do not track the references to destructor's DSO like the __cxa_thread_atexit_impl().
Therefore the DSO, which holds a destructor's code, could be unloaded before destructor execution or before deleting a corresponding key.
So in a complex environment there is no way to know whether it is safe to unload a particular DSO or some tls-destructors are still left.
Suggest this should be fixed or documented, e.g. that the pthread_create_key() with a destructor should not be used from lib.so.
Related to bugs 18136, 21031.