// A C++ compiler is supposed to have thread-safe statics

#include <cstdio>
#include <vector>
#include <pthread.h>

class Singleton
{
public:
  Singleton()
    : value(42)
  { }

  int value;
};

void* thread_func(void*)
{
  static Singleton singleton;

  fprintf(stderr, "%d\n", singleton.value);
  fprintf(stderr, "%d\n", singleton.value);
  fprintf(stderr, "%d\n", singleton.value);
  fprintf(stderr, "%d\n", singleton.value);
  fprintf(stderr, "%d\n", singleton.value);

  return 0;
}

int main(int, char**)
{
  std::vector<pthread_t> thread(2);
  void* v;

  for (std::vector<pthread_t>::iterator p = thread.begin(); p != thread.end();
       p++) {
    if (pthread_create(&*p, 0, thread_func, 0) != 0) {
      fprintf(stderr, "Creation of thread %d failed\n",
              (int)(&*p - &*thread.begin()));
      return 1;
    }
  }

  for (std::vector<pthread_t>::const_iterator p = thread.begin();
       p != thread.end(); p++) {
    pthread_join(*p, &v);
  }

  fprintf(stderr, "Done.\n");

  return 0;
}