I would like to use boost::thread (static library) in a DLL project that
also includes some managed C++. Thus I am attempting to disable the
automatic TLS cleanup, since the TLS callbacks it uses are not
compatible with managed code.
I have found references to two methods of doing this:
1) Define tss_cleanup_implemented() to prevent the automatic cleanup code from being linked in: http://lists.boost.org/Archives/boost/2007/11/130440.php
2) Build the thread library without tss_pe.cpp: http://boost.2283326.n4.nabble.com/Using-new-threads-link-issues-td2637128.html
My questions are:
1) Are these two methods functionally equivalent?
2)
How exactly does defining tss_cleanup_implemented prevent the cleanup
code from being linked in? Is the idea that if a definition exists
locally the linker won't go looking for one in the library and thus
won't link the cleanup code either? When I define extern "C" void tss_cleanup_implemented(void){} within my project
in the global namespace, I get linker errors about multiply defined
symbols (LNK2005, LNK1169) -- are there other linker settings I need to
change in order for it to work? I'm using Visual Studio 2008.
Finally, I just want to confirm that once I've disabled the
automatic cleanup, I only need to call on_thread_exit() from threads
launched through the native API that use boost::thread functionality
like thread_specific_ptr. If the application only launches threads
through boost, I just need to call on_process_enter/exit in main.
Correct?
Thanks,
Sarah