Use std::atomic in getExpTab32f and getLogTab32f
authorNikita Shulga <nikita.shulga@oculus.com>
Mon, 7 Oct 2019 23:32:25 +0000 (16:32 -0700)
committerNikita Shulga <nikita.shulga@oculus.com>
Mon, 7 Oct 2019 23:35:07 +0000 (16:35 -0700)
Reads and writes to volatile bool are not guaranteed to be atomic.

modules/core/src/mathfuncs.cpp

index a4e5263..18bdf6c 100644 (file)
@@ -43,6 +43,7 @@
 
 #include "precomp.hpp"
 #include "opencl_kernels_core.hpp"
+#include <atomic>
 #include <limits>
 #include <iostream>
 #include "mathfuncs.hpp"
@@ -2119,8 +2120,8 @@ const double* getExpTab64f()
 const float* getExpTab32f()
 {
     static float CV_DECL_ALIGNED(64) expTab_f[EXPTAB_MASK+1];
-    static volatile bool expTab_f_initialized = false;
-    if (!expTab_f_initialized)
+    static std::atomic<bool> expTab_f_initialized(false);
+    if (!expTab_f_initialized.load())
     {
         for( int j = 0; j <= EXPTAB_MASK; j++ )
             expTab_f[j] = (float)expTab[j];
@@ -2401,8 +2402,8 @@ const double* getLogTab64f()
 const float* getLogTab32f()
 {
     static float CV_DECL_ALIGNED(64) logTab_f[(LOGTAB_MASK+1)*2];
-    static volatile bool logTab_f_initialized = false;
-    if (!logTab_f_initialized)
+    static std::atomic<bool> logTab_f_initialized(false);
+    if (!logTab_f_initialized.load())
     {
         for (int j = 0; j < (LOGTAB_MASK+1)*2; j++)
             logTab_f[j] = (float)logTab[j];