diff --git a/modules/core/src/parallel.cpp b/modules/core/src/parallel.cpp index 5b1c917e7f..f4a0a75c83 100644 --- a/modules/core/src/parallel.cpp +++ b/modules/core/src/parallel.cpp @@ -134,6 +134,10 @@ # define CV_PARALLEL_FRAMEWORK "pthreads" #endif +#ifdef CV_PARALLEL_FRAMEWORK +#include +#endif + #include "parallel_impl.hpp" #include "opencv2/core/detail/exception_ptr.hpp" // CV__EXCEPTION_PTR = 1 if std::exception_ptr is available @@ -487,20 +491,20 @@ void cv::parallel_for_(const cv::Range& range, const cv::ParallelLoopBody& body, return; #ifdef CV_PARALLEL_FRAMEWORK - static volatile int flagNestedParallelFor = 0; - bool isNotNestedRegion = flagNestedParallelFor == 0; + static std::atomic flagNestedParallelFor(false); + bool isNotNestedRegion = !flagNestedParallelFor.load(); if (isNotNestedRegion) - isNotNestedRegion = CV_XADD(&flagNestedParallelFor, 1) == 0; + isNotNestedRegion = !flagNestedParallelFor.exchange(true); if (isNotNestedRegion) { try { parallel_for_impl(range, body, nstripes); - flagNestedParallelFor = 0; + flagNestedParallelFor = false; } catch (...) { - flagNestedParallelFor = 0; + flagNestedParallelFor = false; throw; } }