[libcxx-commits] [libcxx] [libc++] Replace mutex+condvar with atomics in __call_once (PR #192433)
Shonie Caplan via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Apr 22 23:00:47 PDT 2026
================
@@ -25,8 +27,9 @@ _LIBCPP_BEGIN_NAMESPACE_STD
// keep in sync with: 7741191.
#if _LIBCPP_HAS_THREADS
-static constinit __libcpp_mutex_t mut = _LIBCPP_MUTEX_INITIALIZER;
-static constinit __libcpp_condvar_t cv = _LIBCPP_CONDVAR_INITIALIZER;
+_LIBCPP_EXPORTED_FROM_ABI void __cxx_atomic_notify_all(void const volatile*) _NOEXCEPT;
----------------
shoniecaplan wrote:
Thank you for explaining this, I'm not yet familiar with the functions that are available. I followed your suggestion to use the `std::atomic` versions of the functions and got the following results:
```
Before PR -> using std::atomic
Benchmark Before (ns) After (ns) Change
BM_call_once_steady_mean 0.48 0.48 -0.03%
BM_call_once_steady_median 0.48 0.48 0.05%
BM_call_once_steady_contended/threads:2_mean 0.24 0.24 0.09%
BM_call_once_steady_contended/threads:2_median 0.24 0.24 -0.03%
BM_call_once_steady_contended/threads:4_mean 0.12 0.12 -0.23%
BM_call_once_steady_contended/threads:4_median 0.12 0.12 -0.17%
BM_call_once_steady_contended/threads:8_mean 0.06 0.06 0.66%
BM_call_once_steady_contended/threads:8_median 0.06 0.06 -0.21%
BM_call_once_steady_contended/threads:16_mean 0.03 0.03 0.89%
BM_call_once_steady_contended/threads:16_median 0.03 0.03 1.79%
BM_call_once_cold_mean 12.22 8.94 -26.85%
BM_call_once_cold_median 12.24 8.92 -27.12%
BM_call_once_contended/2_mean 16602.12 14576.39 -12.2%
BM_call_once_contended/2_median 16747.49 14595.57 -12.85%
BM_call_once_contended/4_mean 23283.9 20265.16 -12.96%
BM_call_once_contended/4_median 23184.67 20234.57 -12.72%
BM_call_once_contended/8_mean 63619.59 58282.02 -8.39%
BM_call_once_contended/8_median 63260.33 58507.63 -7.51%
BM_call_once_contended/16_mean 140900.26 138543.62 -1.67%
BM_call_once_contended/16_median 140688.57 138538.85 -1.53%
BM_call_once_slow_init/2_mean 16611.97 14216.15 -14.42%
BM_call_once_slow_init/2_median 16592.95 14224.57 -14.27%
BM_call_once_slow_init/4_mean 24184.6 19847.15 -17.93%
BM_call_once_slow_init/4_median 24197.18 19844.58 -17.99%
BM_call_once_slow_init/8_mean 62917.46 58381.58 -7.21%
BM_call_once_slow_init/8_median 62799.3 58434.95 -6.95%
BM_call_once_slow_init/16_mean 142040.04 137449.77 -3.23%
BM_call_once_slow_init/16_median 142149.12 137394.15 -3.35%
BM_call_once_throughput_mean 12067.11 8864.45 -26.54%
BM_call_once_throughput_median 12067.09 8877.76 -26.43%
```
```
My PR -> using std::atomic
Benchmark Before (ns) After (ns) Change
BM_call_once_steady_mean 0.48 0.48 -0.08%
BM_call_once_steady_median 0.48 0.48 -0.03%
BM_call_once_steady_contended/threads:2_mean 0.24 0.24 -0.11%
BM_call_once_steady_contended/threads:2_median 0.24 0.24 -0.37%
BM_call_once_steady_contended/threads:4_mean 0.12 0.12 -0.14%
BM_call_once_steady_contended/threads:4_median 0.12 0.12 -0.12%
BM_call_once_steady_contended/threads:8_mean 0.06 0.06 0.56%
BM_call_once_steady_contended/threads:8_median 0.06 0.06 -0.1%
BM_call_once_steady_contended/threads:16_mean 0.03 0.03 -0.27%
BM_call_once_steady_contended/threads:16_median 0.03 0.03 -0.35%
BM_call_once_cold_mean 8.3 8.94 7.67%
BM_call_once_cold_median 8.25 8.92 8.1%
BM_call_once_contended/2_mean 14737.43 14576.39 -1.09%
BM_call_once_contended/2_median 14754.72 14595.57 -1.08%
BM_call_once_contended/4_mean 19958.67 20265.16 1.54%
BM_call_once_contended/4_median 19944.39 20234.57 1.45%
BM_call_once_contended/8_mean 58984.56 58282.02 -1.19%
BM_call_once_contended/8_median 58988.88 58507.63 -0.82%
BM_call_once_contended/16_mean 133709.42 138543.62 3.62%
BM_call_once_contended/16_median 133682.59 138538.85 3.63%
BM_call_once_slow_init/2_mean 14168.34 14216.15 0.34%
BM_call_once_slow_init/2_median 14151.16 14224.57 0.52%
BM_call_once_slow_init/4_mean 19558.55 19847.15 1.48%
BM_call_once_slow_init/4_median 19573.23 19844.58 1.39%
BM_call_once_slow_init/8_mean 58559.59 58381.58 -0.3%
BM_call_once_slow_init/8_median 58342.21 58434.95 0.16%
BM_call_once_slow_init/16_mean 133702.61 137449.77 2.8%
BM_call_once_slow_init/16_median 133685.76 137394.15 2.77%
BM_call_once_throughput_mean 8203.92 8864.45 8.05%
BM_call_once_throughput_median 8202.87 8877.76 8.23%
```
Each benchmark was ran for 3 then 8 iterations, with the results above being the 8-iteration comparisons. Everything was consistent with the original benchmark. It seems that we take a hit in a few benchmarks.
https://github.com/llvm/llvm-project/pull/192433
More information about the libcxx-commits
mailing list