1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // <atomic> 11 12 // template <class T> 13 // struct atomic 14 // { 15 // bool is_lock_free() const volatile; 16 // bool is_lock_free() const; 17 // void store(T desr, memory_order m = memory_order_seq_cst) volatile; 18 // void store(T desr, memory_order m = memory_order_seq_cst); 19 // T load(memory_order m = memory_order_seq_cst) const volatile; 20 // T load(memory_order m = memory_order_seq_cst) const; 21 // operator T() const volatile; 22 // operator T() const; 23 // T exchange(T desr, memory_order m = memory_order_seq_cst) volatile; 24 // T exchange(T desr, memory_order m = memory_order_seq_cst); 25 // bool compare_exchange_weak(T& expc, T desr, 26 // memory_order s, memory_order f) volatile; 27 // bool compare_exchange_weak(T& expc, T desr, memory_order s, memory_order f); 28 // bool compare_exchange_strong(T& expc, T desr, 29 // memory_order s, memory_order f) volatile; 30 // bool compare_exchange_strong(T& expc, T desr, 31 // memory_order s, memory_order f); 32 // bool compare_exchange_weak(T& expc, T desr, 33 // memory_order m = memory_order_seq_cst) volatile; 34 // bool compare_exchange_weak(T& expc, T desr, 35 // memory_order m = memory_order_seq_cst); 36 // bool compare_exchange_strong(T& expc, T desr, 37 // memory_order m = memory_order_seq_cst) volatile; 38 // bool compare_exchange_strong(T& expc, T desr, 39 // memory_order m = memory_order_seq_cst); 40 // 41 // atomic() = default; 42 // constexpr atomic(T desr); 43 // atomic(const atomic&) = delete; 44 // atomic& operator=(const atomic&) = delete; 45 // atomic& operator=(const atomic&) volatile = delete; 46 // T operator=(T) volatile; 47 // T operator=(T); 48 // }; 49 // 50 // typedef atomic<bool> atomic_bool; 51 52 #include <atomic> 53 #include <cassert> 54 55 int main() 56 { 57 { 58 volatile std::atomic<bool> _; 59 volatile std::atomic<bool> obj(true); 60 assert(obj == true); 61 std::atomic_init(&obj, false); 62 assert(obj == false); 63 std::atomic_init(&obj, true); 64 assert(obj == true); 65 bool b0 = obj.is_lock_free(); 66 obj.store(false); 67 assert(obj == false); 68 obj.store(true, std::memory_order_release); 69 assert(obj == true); 70 assert(obj.load() == true); 71 assert(obj.load(std::memory_order_acquire) == true); 72 assert(obj.exchange(false) == true); 73 assert(obj == false); 74 assert(obj.exchange(true, std::memory_order_relaxed) == false); 75 assert(obj == true); 76 bool x = obj; 77 assert(obj.compare_exchange_weak(x, false) == true); 78 assert(obj == false); 79 assert(x == true); 80 assert(obj.compare_exchange_weak(x, true, 81 std::memory_order_seq_cst) == false); 82 assert(obj == false); 83 assert(x == false); 84 obj.store(true); 85 x = true; 86 assert(obj.compare_exchange_weak(x, false, 87 std::memory_order_seq_cst, 88 std::memory_order_seq_cst) == true); 89 assert(obj == false); 90 assert(x == true); 91 x = true; 92 obj.store(true); 93 assert(obj.compare_exchange_strong(x, false) == true); 94 assert(obj == false); 95 assert(x == true); 96 assert(obj.compare_exchange_strong(x, true, 97 std::memory_order_seq_cst) == false); 98 assert(obj == false); 99 assert(x == false); 100 x = true; 101 obj.store(true); 102 assert(obj.compare_exchange_strong(x, false, 103 std::memory_order_seq_cst, 104 std::memory_order_seq_cst) == true); 105 assert(obj == false); 106 assert(x == true); 107 assert((obj = false) == false); 108 assert(obj == false); 109 assert((obj = true) == true); 110 assert(obj == true); 111 } 112 { 113 std::atomic<bool> _; 114 std::atomic<bool> obj(true); 115 assert(obj == true); 116 std::atomic_init(&obj, false); 117 assert(obj == false); 118 std::atomic_init(&obj, true); 119 assert(obj == true); 120 bool b0 = obj.is_lock_free(); 121 obj.store(false); 122 assert(obj == false); 123 obj.store(true, std::memory_order_release); 124 assert(obj == true); 125 assert(obj.load() == true); 126 assert(obj.load(std::memory_order_acquire) == true); 127 assert(obj.exchange(false) == true); 128 assert(obj == false); 129 assert(obj.exchange(true, std::memory_order_relaxed) == false); 130 assert(obj == true); 131 bool x = obj; 132 assert(obj.compare_exchange_weak(x, false) == true); 133 assert(obj == false); 134 assert(x == true); 135 assert(obj.compare_exchange_weak(x, true, 136 std::memory_order_seq_cst) == false); 137 assert(obj == false); 138 assert(x == false); 139 obj.store(true); 140 x = true; 141 assert(obj.compare_exchange_weak(x, false, 142 std::memory_order_seq_cst, 143 std::memory_order_seq_cst) == true); 144 assert(obj == false); 145 assert(x == true); 146 x = true; 147 obj.store(true); 148 assert(obj.compare_exchange_strong(x, false) == true); 149 assert(obj == false); 150 assert(x == true); 151 assert(obj.compare_exchange_strong(x, true, 152 std::memory_order_seq_cst) == false); 153 assert(obj == false); 154 assert(x == false); 155 x = true; 156 obj.store(true); 157 assert(obj.compare_exchange_strong(x, false, 158 std::memory_order_seq_cst, 159 std::memory_order_seq_cst) == true); 160 assert(obj == false); 161 assert(x == true); 162 assert((obj = false) == false); 163 assert(obj == false); 164 assert((obj = true) == true); 165 assert(obj == true); 166 } 167 { 168 std::atomic_bool _; 169 std::atomic_bool obj(true); 170 assert(obj == true); 171 std::atomic_init(&obj, false); 172 assert(obj == false); 173 std::atomic_init(&obj, true); 174 assert(obj == true); 175 bool b0 = obj.is_lock_free(); 176 obj.store(false); 177 assert(obj == false); 178 obj.store(true, std::memory_order_release); 179 assert(obj == true); 180 assert(obj.load() == true); 181 assert(obj.load(std::memory_order_acquire) == true); 182 assert(obj.exchange(false) == true); 183 assert(obj == false); 184 assert(obj.exchange(true, std::memory_order_relaxed) == false); 185 assert(obj == true); 186 bool x = obj; 187 assert(obj.compare_exchange_weak(x, false) == true); 188 assert(obj == false); 189 assert(x == true); 190 assert(obj.compare_exchange_weak(x, true, 191 std::memory_order_seq_cst) == false); 192 assert(obj == false); 193 assert(x == false); 194 obj.store(true); 195 x = true; 196 assert(obj.compare_exchange_weak(x, false, 197 std::memory_order_seq_cst, 198 std::memory_order_seq_cst) == true); 199 assert(obj == false); 200 assert(x == true); 201 x = true; 202 obj.store(true); 203 assert(obj.compare_exchange_strong(x, false) == true); 204 assert(obj == false); 205 assert(x == true); 206 assert(obj.compare_exchange_strong(x, true, 207 std::memory_order_seq_cst) == false); 208 assert(obj == false); 209 assert(x == false); 210 x = true; 211 obj.store(true); 212 assert(obj.compare_exchange_strong(x, false, 213 std::memory_order_seq_cst, 214 std::memory_order_seq_cst) == true); 215 assert(obj == false); 216 assert(x == true); 217 assert((obj = false) == false); 218 assert(obj == false); 219 assert((obj = true) == true); 220 assert(obj == true); 221 } 222 } 223