id summary reporter owner description type status milestone component version severity resolution keywords cc 7066 Thread: An attempt to fix current_thread_tls_key static initialization order Pekka Seppänen Anthony Williams "Currently Boost.Thread's Win32 TLS implementation uses a static variable (`thread::current_thread_tls_key`) that is not defined at a function scope. This has a certain shortcoming: As initilization order of global static variables is not predictable, it may happen that `thread::current_thread_tls_key` is used (via `thread::set_current_thread_data()`) before it is actually initialized by compiler (or the underlaying OS, to be precise). (An example: class that uses `thread_specific_ptr` and is not heap allocated.) Potentially any prior versions to Boost 1.50.0 are also affected, as 1.50.0 merely changed the initial value from a zero to a non-zero value. A proposed solution is to move `thread::current_thread_tls_key` inside a function scope (inside a helper function that sole purpose is to return reference to that variable). This ensures that `current_thread_tls_key` is initiliazed properly before it's used for the first time. As `thread::set_current_thread_data()` uses a static `current_thread_tls_init_flag` Boost.Once flag that is currently initialized at a global scope, move that flag too inside a function scope. A patch that implements proposed solution is attached. Unfortunaly, currently no test case exists (not sure if one is too easy to be made; At least on MSVC9 global static variables are initialized before the program's entry point inside a simple loop). " Bugs closed Boost 1.51.0 thread Boost 1.50.0 Problem fixed current_thread_tls_key set_current_thread_data current_thread_tls_init_flag