| /* | |
| * tls.cpp | |
| */ | |
| #define WIN32_LEAN_AND_MEAN | |
| #include <windows.h> | |
| #include <iostream> | |
| #include <process.h> | |
| int __thread tls_value = 0; | |
| unsigned __stdcall thread_fn(void*) | |
| { | |
| ++tls_value; | |
| return 0; | |
| } | |
| // This is derived from the jig that I setup to explore the problems with | |
| // MT exception handling - you could probably just as easily set processors to | |
| // some value rather than tying it to the actual # of cores... | |
| int main() | |
| { | |
| // Get the number of processors available to use | |
| SYSTEM_INFO si; | |
| GetSystemInfo(&si); | |
| const unsigned processors = si.dwNumberOfProcessors; | |
| // Make a thread for every processor and assign the thread to it | |
| HANDLE threads[processors]; | |
| unsigned i; | |
| for (i=0;i<processors;i++) { | |
| threads[i] = (HANDLE)_beginthreadex(0, 0, thread_fn, 0, CREATE_SUSPENDED, 0); | |
| SetThreadAffinityMask(threads[i], 1 << i); | |
| } | |
| // Restart all the threads | |
| for (i=0;i<processors;i++) | |
| ResumeThread(threads[i]); | |
| // Rejoin those threads | |
| WaitForMultipleObjects(processors, threads, 1, INFINITE); | |
| for (i=0;i<processors;i++) | |
| CloseHandle(threads[i]); | |
| std::cout << "How is it possible that tls_value is " | |
| << tls_value << " != 0 ?" << std::endl; | |
| return 0; | |
| } |