Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Initialize static atomic member variable

I would like to generate identifiers for a class named order in a threadsafe manner. The code below does not compile. I know that the atomic types do not have copy constructors, and I assume that explains why this code does not work. Does anybody know a way to actually get this code to work? I'm still learning, so please also let me know if I'm on the wrong track (if so, I would appreciate it if you could point me to an alternative approach). Thanks!

#include <atomic> #include <iostream>  class order { public:      order() { id=c.fetch_add(1); }     int id; private:     static std::atomic<int> c; };  std::atomic<int> order::c = std::atomic<int>(0);  int main() {     order *o1 = new order();     order *o2 = new order();     std::cout << o1->id << std::endl; // Expect 0     std::cout << o2->id << std::endl; // Expect 1 } 

Compiling the above results in the following error:

order.cpp:45:51: error: use of deleted function          ‘std::atomic<int>::atomic(const std::atomic<int>&)’ In file included from order.cpp:3:0: /usr/include/c++/4.7/atomic:594:7: error: declared here 
like image 793
Teisman Avatar asked Dec 08 '13 11:12

Teisman


1 Answers

I know that the atomic types do not have copy constructors, and I assume that explains why this code does not work.

Yes, the error says that quite clearly.

Does anybody know a way to actually get this code to work?

Instead of copy-initialising from a temporary, which requires an accessible copy constructor:

std::atomic<int> order::c = std::atomic<int>(0); 

use direct-initialisation, which doesn't:

std::atomic<int> order::c(0);   // or {0} for a more C++11 experience 

You should probably prefer that anyway, unless you enjoy reading unnecessarily verbose code.

like image 93
Mike Seymour Avatar answered Sep 19 '22 15:09

Mike Seymour