Quantcast
Channel: C++ memory order for consistently storing in atomic variable from multiple threads - Stack Overflow
Viewing all articles
Browse latest Browse all 2

C++ memory order for consistently storing in atomic variable from multiple threads

$
0
0

Running the following code hundreds of times, I expected the printed value to be always 3, but it seems to be 3 only about ~75% of the time. This probably means I have a misunderstanding about the purpose of the various memory orders in C++, or the point of atomic operations. My question is: is there a way to guarantee that the output of the following program is predictable?

#include <atomic>#include <iostream>#include <thread>#include <vector>int main () {  std::atomic<int> cnt{0};  auto f = [&](int n) {cnt.store(n, std::memory_order_seq_cst);};  std::vector<std::thread> v;  for (int n = 1; n < 4; ++n)    v.emplace_back(f, n);  for (auto& t : v)    t.join();  std::cout << cnt.load() << std::endl;  return 0;}

For instance, here's the output statistics after 100 runs:

$ clang++ -std=c++20 -Wall foo.cpp -pthread && for i in {1..100}; do ./a.out; done | sort | uniq -c      2 1     21 2     77 3

Viewing all articles
Browse latest Browse all 2

Latest Images

Trending Articles





Latest Images