diff --git a/src/threads.c b/src/threads.c
index 62666f15a866515b935de44e3daaa58b39312674..10a22584614eea689fc4b1b83884037f400e7b3c 100644
--- a/src/threads.c
+++ b/src/threads.c
@@ -10,7 +10,7 @@ struct object *thread_id;
 
 #ifdef _REENTRANT
 
-MUTEX_T interpreter_lock;
+MUTEX_T interpreter_lock = PTHREAD_MUTEX_INITIALIZER;
 struct program *mutex_key = 0;
 struct program *thread_id_prog = 0;
 pthread_attr_t pattr;
@@ -26,9 +26,13 @@ void *new_thread_func(void * data)
   struct thread_starter arg = *(struct thread_starter *)data;
   JMP_BUF back;
   INT32 args;
+
   free((char *)data);
+
+  if(args=mt_lock( & interpreter_lock))
+    fatal("Failed to lock interpreter, errno %d\n",args);
+
   args=arg.args->size;
-  mt_lock( & interpreter_lock);
   init_interpreter();
 
   thread_id=arg.id;
@@ -44,13 +48,12 @@ void *new_thread_func(void * data)
   } else {
     push_array_items(arg.args);
     arg.args=0;
-    f_call_function(args);
-
   }
 
   UNSETJMP(back);
 
   destruct(thread_id);
+
   free_object(thread_id);
   thread_id=0;
 
@@ -60,10 +63,11 @@ void *new_thread_func(void * data)
   th_exit(0);
 }
 
+
 void f_thread_create(INT32 args)
 {
-  struct thread_starter *arg;
   pthread_t dummy;
+  struct thread_starter *arg;
   int tmp;
   arg=ALLOC_STRUCT(thread_starter);
   arg->args=aggregate_array(args);
@@ -122,7 +126,7 @@ struct key_storage
   int initialized;
 };
 
-static MUTEX_T mutex_kluge;
+static MUTEX_T mutex_kluge = PTHREAD_MUTEX_INITIALIZER;
 
 #define OB2KEY(X) ((struct key_storage *)((X)->storage))