Use atomic operations to modify flagNestedParallelFor

This ensures uniform behavior on any C++11 compliant compiler
This commit is contained in:
Nikita Shulga 2019-10-07 10:58:25 -07:00
parent 626bfbf309
commit 23288b7cb5

View File

@ -134,6 +134,10 @@
# define CV_PARALLEL_FRAMEWORK "pthreads"
#endif
#ifdef CV_PARALLEL_FRAMEWORK
#include <atomic>
#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<bool> 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;
}
}