From 56faa3dc8de3189d8c415c6b9fe91385e549a2fc Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Mon, 11 Oct 2021 17:26:43 +0900 Subject: [PATCH] Used compare_exchange_weak for decriment and comparison. --- example/bench.cpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/example/bench.cpp b/example/bench.cpp index 2c9cea017..8f4851c2c 100644 --- a/example/bench.cpp +++ b/example/bench.cpp @@ -18,6 +18,15 @@ namespace as = boost::asio; +template +bool compare_decrement(std::atomic& val, T comp) { + T old = val.load(); + do { + if (old == comp) return true; + } while (!val.compare_exchange_weak(old, old - 1)); + return false; +} + int main(int argc, char **argv) { try { boost::program_options::options_description desc; @@ -568,9 +577,7 @@ int main(int argc, char **argv) { async_wait_pub(ci); } - if (--rest_times == 0) { - finish_proc(); - } + if (compare_decrement(rest_times, std::uint64_t(1))) finish_proc(); return true; }; @@ -585,7 +592,7 @@ int main(int argc, char **argv) { [&] (bool /*sp*/, MQTT_NS::connect_return_code connack_return_code) { if (connack_return_code == MQTT_NS::connect_return_code::accepted) { - if (--rest_connect == 0) sub_proc(); + if (compare_decrement(rest_connect, std::size_t(1))) sub_proc(); } else { std::cout << "connack error:" << connack_return_code << std::endl; @@ -597,7 +604,7 @@ int main(int argc, char **argv) { [&] (bool /*sp*/, MQTT_NS::v5::connect_reason_code reason_code, MQTT_NS::v5::properties /*props*/) { if (reason_code == MQTT_NS::v5::connect_reason_code::success) { - if (--rest_connect == 0) sub_proc(); + if (compare_decrement(rest_connect, std::size_t(1))) sub_proc(); } else { std::cout << "connack error:" << reason_code << std::endl; @@ -613,7 +620,7 @@ int main(int argc, char **argv) { if (results.front() == MQTT_NS::suback_return_code::success_maximum_qos_0 || results.front() == MQTT_NS::suback_return_code::success_maximum_qos_1 || results.front() == MQTT_NS::suback_return_code::success_maximum_qos_2) { - if (--rest_sub == 0) pub_proc(); + if (compare_decrement(rest_sub, std::size_t(1))) pub_proc(); } return true; } @@ -627,7 +634,7 @@ int main(int argc, char **argv) { if (reasons.front() == MQTT_NS::v5::suback_reason_code::granted_qos_0 || reasons.front() == MQTT_NS::v5::suback_reason_code::granted_qos_1 || reasons.front() == MQTT_NS::v5::suback_reason_code::granted_qos_2) { - if (--rest_sub == 0) pub_proc(); + if (compare_decrement(rest_sub, std::size_t(1))) pub_proc(); } return true; }