blob: b5dbe2d1251b16c41af66aee5cabefa58106bc06 [file] [log] [blame]
/*
* 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;
}