diff --git a/emper/io/IoContext.hpp b/emper/io/IoContext.hpp
index 60b1e99a8a55194a08ab236135119ccda891aa93..b8aa5b9cb585a82ef7fdf48e98919c26615d01c2 100644
--- a/emper/io/IoContext.hpp
+++ b/emper/io/IoContext.hpp
@@ -413,6 +413,12 @@ class IoContext : public Logger<LogSubsystem::IO> {
 			return reapCompletionsLockless<callerEnvironment>(continuations, toReap);
 		}
 
+		// CallerEnvironment::EMPER means we are in a stealing worker.
+		// Check if the victim's CQ is empty before taking the lock.
+		if constexpr (callerEnvironment == CallerEnvironment::EMPER) {
+			if (!cqeCount()) return 0;
+		}
+
 		return reapCompletionsLocked<callerEnvironment>(continuations, toReap);
 	}
 
diff --git a/emper/strategies/AbstractWorkStealingScheduler.cpp b/emper/strategies/AbstractWorkStealingScheduler.cpp
index 83ca87697bed3529b67f7e2ae5a5b544c06bcb39..5f20567f130017815a6b7abb01ff1e94560b42ae 100644
--- a/emper/strategies/AbstractWorkStealingScheduler.cpp
+++ b/emper/strategies/AbstractWorkStealingScheduler.cpp
@@ -139,12 +139,10 @@ popTop:
 
 	if constexpr (emper::IO_STEALING) {
 		auto* victimIo = runtime.ioContexts[victim];
-		if (victimIo->cqeCount()) {
-			fiber = victimIo->reapSingleCompletion<CallerEnvironment::EMPER>();
-			if (fiber) {
-				emper::statsIncr(awss::stats.nextIoFiberStolen);
-				return std::make_pair(fiber, FiberSource::ioStolen);
-			}
+		fiber = victimIo->reapSingleCompletion<CallerEnvironment::EMPER>();
+		if (fiber) {
+			emper::statsIncr(awss::stats.nextIoFiberStolen);
+			return std::make_pair(fiber, FiberSource::ioStolen);
 		}
 	}