boostorg / thread

Boost.org thread module
http://boost.org/libs/thread
197 stars 162 forks source link

pthread key leak #363

Open Mario-Klebsch opened 2 years ago

Mario-Klebsch commented 2 years ago

I am using boost::thread statically linkes in a shared library and found a pthread key leak. When I repeat loading and unloading the library, pthread keys are leaking and after some time, I get

main: boost_1_77_0/libs/thread/src/pthread/thread.cpp:148: void boost::detail::{anonymous}::create_current_thread_tls_key(): Assertion `!pthread_key_create(&current_thread_tls_key,&tls_destructor)' failed.

The leaking pthread key is allocated in libs/thread/src/pthread/thread.cpp. The code for de-allocating the pthread key is #ifdef'ed with BOOST_THREAD_PATCH. Without BOOST_THREAD_PATCH, the binary only calls to pthread_key_create, but no call to pthread_key_delete:

The problem seems to be solved, if I #define BOOST_THREAD_PATCH. But this #ifdef was added in 47357de276fe4fc01469f34c1dbf8b26fdbc1c4b to solve bug #12049. (https://www.boost.org/doc/libs/1_64_0/doc/html/thread/changes.html) (https://svn.boost.org/trac10/ticket/12049)

Unfortunately, I do not really understand the problem in ticket #12049. To me, it looks like a race condition and the leaking pthread key just prevents any harm caused by the race condition. That doesn't really look like a fix to me, just solves one problem by creating a new one. :-(

Here is my source code: boost_pthread_key_leak.zip

I am using linux on x86_64, c++ (Gentoo 10.3.0-r2 p3) 10.3.0