Easiest way to implement shared integer counter in C++11 without mutexes:

c++, c++11, multithreading, stdatomic

Solution

You might want to look into atomic types. You can access them without a need for a lock/mutex.

Problem

Suppose we have the following code which counts the number of times something occurs: ``` int i=0; void f() { // do stuff . . . if(something_happens) ++i; } int main() { std::vector<std::thread> threads; for(int j = 0; j< std::thread::hardware_concurrency(); ++j) { threads.push_back(std::thread(f)); } std::for_each(threads.begin(), threads.end(), std::mem_fn(&std::thread_join)); std::cout << "i = " << i << '\n'; } ``` As it stands there is a clear race condition on i. Using C++11, what is (1) the easiest method for eliminating this race condition, and (2) the fastest method?, preferably without using mutexes. Thanks. Update: Using the comment to use atomics, I got a working program which compiles under the Intel Compiler, version 13: ``` #include <iostream> #include <thread> #include <vector> #include <atomic> #include <algorithm> std::atomic<unsigned long long> i = 0; void f(int j) { if(j%2==0) { ++i; } } int main() { std::cout << "Atomic i = " << i << "\n"; int numThreads = 8; //std::thread::hardware_concurrency() not yet implemented by Intel std::vector<std::thread> threads; for(int k=0; k< numThreads; ++k) { threads.push_back(std::thread(f, k)); } std::for_each(threads.begin(), threads.end(), std::mem_fn(&std::thread::join)); std::cout << "Atomic i = " << i << "\n"; } ```

Original source