Logo Search packages:      
Sourcecode: mingw-w64 version File versions  Download package

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

Generated by  Doxygen 1.6.0   Back to index