From d6c79299fb2b9a5c326ef5b4de497141cd650d4a Mon Sep 17 00:00:00 2001 From: Matt Hill Date: Sun, 4 May 2014 14:07:57 -0500 Subject: [PATCH] Fixed race condition bug on multithreading --- src/openalpr/alpr_impl.cpp | 11 ++++------- src/openalpr/alpr_impl.h | 18 +++++++----------- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/src/openalpr/alpr_impl.cpp b/src/openalpr/alpr_impl.cpp index e086e2b..50d2c50 100644 --- a/src/openalpr/alpr_impl.cpp +++ b/src/openalpr/alpr_impl.cpp @@ -159,18 +159,15 @@ void plateAnalysisThread(void* arg) int loop_count = 0; while (true) { - - if (dispatcher->hasPlate() == false) + PlateRegion plateRegion; + if (dispatcher->nextPlate(&plateRegion) == false) break; if (dispatcher->config->debugGeneral) cout << "Thread: " << tthread::this_thread::get_id() << " loop " << ++loop_count << endl; - - // Get a single plate region from the queue - PlateRegion plateRegion = dispatcher->nextPlate(); - + Mat img = dispatcher->getImageCopy(); - + timespec platestarttime; getTime(&platestarttime); diff --git a/src/openalpr/alpr_impl.h b/src/openalpr/alpr_impl.h index eb54cd0..cc003d5 100644 --- a/src/openalpr/alpr_impl.h +++ b/src/openalpr/alpr_impl.h @@ -109,22 +109,18 @@ class PlateDispatcher return img; } - bool hasPlate() - { - bool plateAvailable; - mMutex.lock(); - plateAvailable = plateRegions.size() > 0; - mMutex.unlock(); - return plateAvailable; - } - PlateRegion nextPlate() + + bool nextPlate(PlateRegion* plateRegion) { tthread::lock_guard guard(mMutex); - PlateRegion plateRegion = plateRegions[plateRegions.size() - 1]; + if (plateRegions.size() == 0) + return false; + + *plateRegion = plateRegions[plateRegions.size() - 1]; plateRegions.pop_back(); - return plateRegion; + return true; } void appendPlate(PlateRegion plate)