diff --git a/rts/Schedule.c b/rts/Schedule.c
index 9535bbd2311e3e1722fd8fee9ae06fbe5c540218..0f10b5170ef4b854c77428e8b67893ea4df302d0 100644
--- a/rts/Schedule.c
+++ b/rts/Schedule.c
@@ -835,7 +835,7 @@ schedulePushWork(Capability *cap USED_IF_THREADS,
                 if (t->bound) {
                     t->bound->task->cap = free_caps[i];
                 }
-                t->cap = free_caps[i];
+                RELAXED_STORE(&t->cap, free_caps[i]);
                 n--; // we have one fewer threads now
                 i++; // move on to the next free_cap
                 if (i == n_free_caps) i = 0;
diff --git a/rts/Threads.c b/rts/Threads.c
index 46a70a11a8bf3a5cb68d26fc839f01c16aa87dff..fc6544ad358a820ff2276da82c9173673721283d 100644
--- a/rts/Threads.c
+++ b/rts/Threads.c
@@ -272,15 +272,16 @@ tryWakeupThread (Capability *cap, StgTSO *tso)
     traceEventThreadWakeup (cap, tso, tso->cap->no);
 
 #if defined(THREADED_RTS)
-    if (tso->cap != cap)
+    Capability *tso_owner = RELAXED_LOAD(&tso->cap);
+    if (tso_owner != cap)
     {
         MessageWakeup *msg;
         msg = (MessageWakeup *)allocate(cap,sizeofW(MessageWakeup));
         msg->tso = tso;
         SET_HDR(msg, &stg_MSG_TRY_WAKEUP_info, CCS_SYSTEM);
-        sendMessage(cap, tso->cap, (Message*)msg);
+        sendMessage(cap, tso_owner, (Message*)msg);
         debugTraceCap(DEBUG_sched, cap, "message: try wakeup thread %"
-                      FMT_StgThreadID " on cap %d", tso->id, tso->cap->no);
+                      FMT_StgThreadID " on cap %d", tso->id, tso_owner->no);
         return;
     }
 #endif