[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