Static Initialization in C ++ and Thread Safety

Static initialization of class instances is not thread safe. The code below is an example of what not to do:

extern int computesomething(); class cachedcomputation { public: cachedcomputation() { result = computesomething(); } int result; }; void usecached() { static cachedcomputation c; // use of c.result - may break } 

However, will the code below be thread safe? (Ignoring the ugliness of the decision) When or why will it break?

 extern int computesomething(); class cachedcomputation { public: cachedcomputation() { if(0==InterlockedCompareExchange(&mutex, 1, 0)) { // first thread result = computesomething(); InterlockedExchange(&mutex, 2); } else { // other thread - spinlock until mutex==2 while(2!=InterlockedCompareExchange(&mutex, 2, 2)){} } } int result; private: long mutex; }; void usecached() { static cachedcomputation c; // use of c.result - ??? } 
+4
source share
1 answer

You need:

  • initialize your mutex
  • reset "mutex" at the end of if block: InterlockedExchange (& mutex, 0)
  • it is not necessary to convert if-statement at a time, so your code will be blocked until the mutex is unlocked
+3
source

Source: https://habr.com/ru/post/1445433/


All Articles