From f6bd578c8aadda549b9416f110f1b3c4f9be93b6 Mon Sep 17 00:00:00 2001 From: mutouyun Date: Mon, 20 Sep 2021 23:29:30 +0800 Subject: [PATCH] reduce the number of recheck times for the sleep function --- include/libipc/rw_lock.h | 4 ++-- test/test_sync.cpp | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/include/libipc/rw_lock.h b/include/libipc/rw_lock.h index 5757b23..31ed9de 100755 --- a/include/libipc/rw_lock.h +++ b/include/libipc/rw_lock.h @@ -72,7 +72,7 @@ inline void yield(K& k) noexcept { ++k; } -template +template inline void sleep(K& k, F&& f) { if (k < static_cast(N)) { std::this_thread::yield(); @@ -84,7 +84,7 @@ inline void sleep(K& k, F&& f) { ++k; } -template +template inline void sleep(K& k) { sleep(k, [] { std::this_thread::sleep_for(std::chrono::milliseconds(1)); diff --git a/test/test_sync.cpp b/test/test_sync.cpp index a1361fb..d966e30 100644 --- a/test/test_sync.cpp +++ b/test/test_sync.cpp @@ -160,4 +160,33 @@ TEST(Sync, Condition) { cond.broadcast(); for (auto &t : test_conds) t.join(); +} + +TEST(Sync, ConditionRobust) { + printf("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 1\n"); + ipc::sync::condition cond {"test-cond"}; + printf("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 2\n"); + ipc::sync::mutex lock {"test-mutex"}; + printf("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 3\n"); + lock.lock(); + std::thread unlock {[] { + printf("WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW 1\n"); + ipc::sync::condition cond {"test-cond"}; + printf("WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW 2\n"); + ipc::sync::mutex lock {"test-mutex"}; + printf("WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW 3\n"); + { + std::lock_guard guard {lock}; + } + std::this_thread::sleep_for(std::chrono::seconds(1)); + printf("WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW 4\n"); + cond.notify(); + printf("WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW 5\n"); + }}; + printf("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 4\n"); + cond.wait(lock); + printf("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 5\n"); + lock.unlock(); + printf("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 6\n"); + unlock.join(); } \ No newline at end of file