diff --git a/src/qsched.c b/src/qsched.c
index 30c9111bcbc235c6b540ad2e888fdf6a9e2bf28d..75286d3bd62ec33575578fa7d0921850613aabb9 100644
--- a/src/qsched.c
+++ b/src/qsched.c
@@ -52,6 +52,8 @@ char *qsched_timer_names[ qsched_timer_count ] =
     
 #if defined( HAVE_PTHREAD )
 pthread_key_t qsched_pointer;
+volatile int key_exists = 0;
+volatile int pthread_key_mutex;
 #endif
     
 /**
@@ -536,7 +538,7 @@ void qsched_run ( struct qsched *s , int nr_threads , qsched_funtype fun ) {
 int qsched_get_tid() {
   struct qsched *s = NULL;
   #if defined( HAVE_PTHREAD )
-  s = (struct qsched *)pthread_getspecific(qsched_pointer);
+    s = (struct qsched *)pthread_getspecific(qsched_pointer);
   #endif
   if( s != NULL )
     return *(int*)pthread_getspecific(s->thread_id_key);
@@ -1655,7 +1657,12 @@ void qsched_init ( struct qsched *s , int nr_queues , int flags ) {
             error( "Failed to lock barrier mutex." );
       }
       pthread_key_create(&s->thread_id_key, NULL);
-      pthread_key_create(&qsched_pointer, NULL);
+  while(__sync_val_compare_and_swap(&pthread_key_mutex, 0, 1)!=0);
+  if(!key_exists){
+    pthread_key_create(&qsched_pointer, NULL);
+    key_exists=1;
+  }
+  pthread_key_mutex = 0;
     #endif
     
     /* Clear the timers. */