diff --git a/src/core/hle/kernel/scheduler.cpp b/src/core/hle/kernel/scheduler.cpp
index 4e2a5adf38..74d3731fc6 100644
--- a/src/core/hle/kernel/scheduler.cpp
+++ b/src/core/hle/kernel/scheduler.cpp
@@ -604,7 +604,6 @@ void Scheduler::SwitchContextStep2() {
 
     if (new_thread) {
         auto& cpu_core = system.ArmInterface(core_id);
-        new_thread->context_guard.lock();
         cpu_core.Lock();
         ASSERT_MSG(new_thread->GetSchedulingStatus() == ThreadSchedStatus::Runnable,
                    "Thread must be runnable.");
@@ -685,13 +684,24 @@ void Scheduler::OnSwitch(void* this_scheduler) {
 
 void Scheduler::SwitchToCurrent() {
     while (true) {
-        std::shared_ptr<Common::Fiber> next_context;
-        if (current_thread != nullptr) {
-            next_context = current_thread->GetHostContext();
-        } else {
-            next_context = idle_thread->GetHostContext();
+        guard.lock();
+        selected_thread = selected_thread_set;
+        current_thread = selected_thread;
+        guard.unlock();
+        while (!is_context_switch_pending) {
+            current_thread->context_guard.lock();
+            if (current_thread->GetSchedulingStatus() != ThreadSchedStatus::Runnable) {
+                current_thread->context_guard.unlock();
+                break;
+            }
+            std::shared_ptr<Common::Fiber> next_context;
+            if (current_thread != nullptr) {
+                next_context = current_thread->GetHostContext();
+            } else {
+                next_context = idle_thread->GetHostContext();
+            }
+            Common::Fiber::YieldTo(switch_fiber, next_context);
         }
-        Common::Fiber::YieldTo(switch_fiber, next_context);
     }
 }