diff --git a/sim_tape.c b/sim_tape.c
index 7c2ffe2c..28d20619 100644
--- a/sim_tape.c
+++ b/sim_tape.c
@@ -322,10 +322,19 @@ sim_debug (ctx->dbit, ctx->dptr, "_tape_completion_dispatch(unit=%d, top=%d, cal
 if (ctx->io_top != TOP_DONE)
     abort();                                            /* horribly wrong, stop */
 
-if (ctx->callback && ctx->io_top == TOP_DONE) {
+if (ctx->asynch_io)
+    pthread_mutex_lock (&ctx->io_lock);
+
+if (ctx->callback) {
     ctx->callback = NULL;
+    if (ctx->asynch_io)
+        pthread_mutex_unlock (&ctx->io_lock);
     callback (uptr, ctx->io_status);
     }
+else {
+    if (ctx->asynch_io)
+        pthread_mutex_unlock (&ctx->io_lock);
+    }
 }
 
 static t_bool _tape_is_active (UNIT *uptr)