
Aaron W. LaFramboise wrote:
Following is an implementation of, and some comments on, a staticly linked Boost.Thread thread exit handler for MSVC.
Wow, great. It works on MSVC71, but not on MSVC6. I tried following, very simple test code, compiled with any of CRT variants /MD /MDd /MT or /MTd . What's meaning of data_seg(".CRT$XLB")? #define WIN32_LEAN_AND_MEAN #include <windows.h> DWORD WINAPI f(void *) { Sleep(500); return 0; } // Report thread and process detach events. void NTAPI tls_callback(PVOID, DWORD Reason, PVOID) { if(Reason == DLL_THREAD_DETACH) Beep(440, 100); else if(Reason == DLL_PROCESS_DETACH) Beep(880, 50); } int main(int argc, char* argv[]) { DWORD id; HANDLE h = CreateThread(NULL, 0, &f, 0, 0, &id); WaitForSingleObject(h, INFINITE); CloseHandle(h); Sleep(300); return 0; } #pragma optimize ("", off) namespace { // "__declspec(thread)" is documented in MSDN to create .tls section extern __declspec(thread) int dummy_ = 1; int dummy() {return dummy_;} } #pragma optimize ("", on) #pragma data_seg(".CRT$XLB") DWORD callback_ptr = (DWORD)tls_callback;