Home | History | Annotate | Download | only in tests
      1 // A C++ compiler is supposed to have thread-safe statics
      2 
      3 #include <cstdio>
      4 #include <vector>
      5 #include <pthread.h>
      6 
      7 class Singleton
      8 {
      9 public:
     10   Singleton()
     11     : value(42)
     12   { }
     13 
     14   int value;
     15 };
     16 
     17 void* thread_func(void*)
     18 {
     19   static Singleton singleton;
     20 
     21   fprintf(stderr, "%d\n", singleton.value);
     22   fprintf(stderr, "%d\n", singleton.value);
     23   fprintf(stderr, "%d\n", singleton.value);
     24   fprintf(stderr, "%d\n", singleton.value);
     25   fprintf(stderr, "%d\n", singleton.value);
     26 
     27   return 0;
     28 }
     29 
     30 int main(int, char**)
     31 {
     32   std::vector<pthread_t> thread(2);
     33   void* v;
     34 
     35   for (std::vector<pthread_t>::iterator p = thread.begin(); p != thread.end();
     36        p++) {
     37     if (pthread_create(&*p, 0, thread_func, 0) != 0) {
     38       fprintf(stderr, "Creation of thread %d failed\n",
     39               (int)(&*p - &*thread.begin()));
     40       return 1;
     41     }
     42   }
     43 
     44   for (std::vector<pthread_t>::const_iterator p = thread.begin();
     45        p != thread.end(); p++) {
     46     pthread_join(*p, &v);
     47   }
     48 
     49   fprintf(stderr, "Done.\n");
     50 
     51   return 0;
     52 }
     53 
     54