mirror of
https://github.com/opencv/opencv.git
synced 2024-11-29 22:00:25 +08:00
Use atomic operations to modify flagNestedParallelFor
This ensures uniform behavior on any C++11 compliant compiler
This commit is contained in:
parent
626bfbf309
commit
23288b7cb5
@ -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;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user