[libcxx-commits] [libcxx] [libc++][test] atomit wait test take 2 (PR #169206)
via libcxx-commits
libcxx-commits at lists.llvm.org
Sun Nov 23 01:37:35 PST 2025
https://github.com/huixie90 created https://github.com/llvm/llvm-project/pull/169206
- **[libc++] test for atomic::wait**
- **seq_cst**
>From bf78bf3d839bbcb4a6555e32bbc150ef4371cbf4 Mon Sep 17 00:00:00 2001
From: Hui Xie <hui.xie1990 at gmail.com>
Date: Sat, 22 Nov 2025 17:37:22 +0000
Subject: [PATCH 1/2] [libc++] test for atomic::wait
---
.../lost_wakeup.pass.cpp | 58 +++++++++++++++++++
1 file changed, 58 insertions(+)
create mode 100644 libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.wait/lost_wakeup.pass.cpp
diff --git a/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.wait/lost_wakeup.pass.cpp b/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.wait/lost_wakeup.pass.cpp
new file mode 100644
index 0000000000000..5a0d587815828
--- /dev/null
+++ b/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.wait/lost_wakeup.pass.cpp
@@ -0,0 +1,58 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: no-threads
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+
+// This is a stress test for std::atomic::wait for lost wake ups.
+
+// <atomic>
+
+#include <atomic>
+#include <functional>
+#include <thread>
+#include <vector>
+
+#include "make_test_thread.h"
+
+constexpr int num_waiters = 8;
+constexpr int num_iterations = 10'000;
+
+int main(int, char**) {
+ for (int run = 0; run < 20; ++run) {
+ std::atomic<int> waiter_ready(0);
+ std::atomic<int> state(0);
+
+ auto wait = [&]() {
+ for (int i = 0; i < num_iterations; ++i) {
+ auto old_state = state.load(std::memory_order_acquire);
+ waiter_ready.fetch_add(1, std::memory_order_acq_rel);
+ state.wait(old_state, std::memory_order_acquire);
+ }
+ };
+
+ auto notify = [&] {
+ for (int i = 0; i < num_iterations; ++i) {
+ while (waiter_ready.load(std::memory_order_acquire) < num_waiters) {
+ std::this_thread::yield();
+ }
+ waiter_ready.store(0, std::memory_order_release);
+ state.fetch_add(1, std::memory_order_acq_rel);
+ state.notify_all();
+ }
+ };
+
+ std::vector<std::jthread> threads;
+ for (int i = 0; i < num_waiters; ++i)
+ threads.push_back(support::make_test_jthread(wait));
+
+ threads.push_back(support::make_test_jthread(notify));
+ }
+
+ return 0;
+}
>From 020f47f84a5711208379e83626a5f31af0576d8f Mon Sep 17 00:00:00 2001
From: Hui Xie <hui.xie1990 at gmail.com>
Date: Sun, 23 Nov 2025 09:36:57 +0000
Subject: [PATCH 2/2] seq_cst
---
.../lost_wakeup.pass.cpp | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.wait/lost_wakeup.pass.cpp b/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.wait/lost_wakeup.pass.cpp
index 5a0d587815828..fc96ea1a8f201 100644
--- a/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.wait/lost_wakeup.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.wait/lost_wakeup.pass.cpp
@@ -30,19 +30,19 @@ int main(int, char**) {
auto wait = [&]() {
for (int i = 0; i < num_iterations; ++i) {
- auto old_state = state.load(std::memory_order_acquire);
- waiter_ready.fetch_add(1, std::memory_order_acq_rel);
- state.wait(old_state, std::memory_order_acquire);
+ auto old_state = state.load();
+ waiter_ready.fetch_add(1);
+ state.wait(old_state);
}
};
auto notify = [&] {
for (int i = 0; i < num_iterations; ++i) {
- while (waiter_ready.load(std::memory_order_acquire) < num_waiters) {
+ while (waiter_ready.load() < num_waiters) {
std::this_thread::yield();
}
- waiter_ready.store(0, std::memory_order_release);
- state.fetch_add(1, std::memory_order_acq_rel);
+ waiter_ready.store(0);
+ state.fetch_add(1);
state.notify_all();
}
};
More information about the libcxx-commits
mailing list