From ec37364762f4cd0a5218a4d610aa485747dfede9 Mon Sep 17 00:00:00 2001 From: Nikita Shulga Date: Mon, 7 Oct 2019 16:32:25 -0700 Subject: [PATCH] Use std::atomic in getExpTab32f and getLogTab32f Reads and writes to volatile bool are not guaranteed to be atomic. --- modules/core/src/mathfuncs.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/core/src/mathfuncs.cpp b/modules/core/src/mathfuncs.cpp index a4e5263aa8..18bdf6ce4d 100644 --- a/modules/core/src/mathfuncs.cpp +++ b/modules/core/src/mathfuncs.cpp @@ -43,6 +43,7 @@ #include "precomp.hpp" #include "opencl_kernels_core.hpp" +#include #include #include #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 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 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];