| /* | 
 |  * 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; | 
 | } |