[C++] Fixed race condition in MemoryLimitController (#10142)

diff --git a/pulsar-client-cpp/lib/MemoryLimitController.cc b/pulsar-client-cpp/lib/MemoryLimitController.cc
index 7ace3fe..81578c9 100644
--- a/pulsar-client-cpp/lib/MemoryLimitController.cc
+++ b/pulsar-client-cpp/lib/MemoryLimitController.cc
@@ -42,9 +42,14 @@
 }
 
 void MemoryLimitController::reserveMemory(uint64_t size) {
-    while (!tryReserveMemory(size)) {
+    if (!tryReserveMemory(size)) {
         std::unique_lock<std::mutex> lock(mutex_);
-        condition_.wait(lock);
+
+        // Check again, while holding the lock, to ensure we reserve attempt and the waiting for the condition
+        // are synchronized.
+        while (!tryReserveMemory(size)) {
+            condition_.wait(lock);
+        }
     }
 }