1 #include <atomic>
2
3 template <class A, class T>
cmpxchg_weak_loop(A & atomic,T & expected,T desired)4 bool cmpxchg_weak_loop(A& atomic, T& expected, T desired) {
5 for (int i = 0; i < 10; i++) {
6 if (atomic.compare_exchange_weak(expected, desired) == true) {
7 return true;
8 }
9 }
10
11 return false;
12 }
13
14 template <class A, class T>
cmpxchg_weak_loop(A & atomic,T & expected,T desired,std::memory_order success,std::memory_order failure)15 bool cmpxchg_weak_loop(A& atomic, T& expected, T desired,
16 std::memory_order success,
17 std::memory_order failure) {
18 for (int i = 0; i < 10; i++) {
19 if (atomic.compare_exchange_weak(expected, desired, success,
20 failure) == true) {
21 return true;
22 }
23 }
24
25 return false;
26 }
27
28 template <class A, class T>
c_cmpxchg_weak_loop(A * atomic,T * expected,T desired)29 bool c_cmpxchg_weak_loop(A* atomic, T* expected, T desired) {
30 for (int i = 0; i < 10; i++) {
31 if (std::atomic_compare_exchange_weak(atomic, expected, desired) == true) {
32 return true;
33 }
34 }
35
36 return false;
37 }
38
39 template <class A, class T>
c_cmpxchg_weak_loop(A * atomic,T * expected,T desired,std::memory_order success,std::memory_order failure)40 bool c_cmpxchg_weak_loop(A* atomic, T* expected, T desired,
41 std::memory_order success,
42 std::memory_order failure) {
43 for (int i = 0; i < 10; i++) {
44 if (std::atomic_compare_exchange_weak_explicit(atomic, expected, desired,
45 success, failure) == true) {
46 return true;
47 }
48 }
49
50 return false;
51 }
52