diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp
index d3df289f8..ab9403007 100644
--- a/src/citra_qt/bootmanager.cpp
+++ b/src/citra_qt/bootmanager.cpp
@@ -59,6 +59,9 @@ void EmuThread::run() {
             yieldCurrentThread();
             
             was_active = false;
+        } else {
+            std::unique_lock<std::mutex> lock(running_mutex);
+            running_cv.wait(lock, [this]{ return IsRunning() || stop_run; });
         }
     }
 
diff --git a/src/citra_qt/bootmanager.h b/src/citra_qt/bootmanager.h
index d5d74c949..16809eaae 100644
--- a/src/citra_qt/bootmanager.h
+++ b/src/citra_qt/bootmanager.h
@@ -3,6 +3,8 @@
 // Refer to the license.txt file included.
 
 #include <atomic>
+#include <condition_variable>
+#include <mutex>
 
 #include <QThread>
 #include <QGLWidget>
@@ -40,7 +42,12 @@ public:
      * @param running Boolean value, set the emulation thread to running if true
      * @note This function is thread-safe
      */
-    void SetRunning(bool running) { this->running = running; }
+    void SetRunning(bool running) {
+        std::unique_lock<std::mutex> lock(running_mutex);
+        this->running = running;
+        lock.unlock();
+        running_cv.notify_all();
+    }
 
     /**
      * Check if the emulation thread is running or not
@@ -54,13 +61,15 @@ public:
      */
     void RequestStop() {
         stop_run = true;
-        running = false;
+        SetRunning(false);
     };
 
 private:
     bool exec_step;
     bool running;
     std::atomic<bool> stop_run;
+    std::mutex running_mutex;
+    std::condition_variable running_cv;
 
     GRenderWindow* render_window;