Friday, November 1, 2013

Mutithreading syncronization issue

I have an issue with my code ... my below code is createing databases(database here is a kd tree) and indexing one image per database. i have two classes LastDatabaseTndexingPolicy and another forwardingDatabaseaccessor.cpp .

I am calling the GetDatabaseToAccess() function from forwardingDatabaseAccessor.cpp class .GetDatabaseToAccess() function is present in LastDatabaseTndexingPolicy class and it returns the database created as a pointer and using that database pointer we call another function which actually indexes the image to the database .

Now my issue is i am not able to have multiple threads act on the following functions as DatabaseAccessorptr db which is in the following file is coupled with two functions and however i put locks in the LastDatabaseTndexingPolicy file as below i end up getting synchronization issue ..........

Hence now i am using a single lock in forwardingDatabaseAccessor.cpp and serializing the code,.can anyone suggest me how can i change my design to parallelize this code .........

In ForwardingDatabaseAccessor.cpp we are calling function from LastDatabaseTndexingPolicy as shown below:-

DatabaseAccessorptr db is something which needs to be synchroinized. I tried createing 256 databases with one image each and when i run this code i ended up creating 175 databses and though i was restricting in code with locks that every database has only one image i ended up having two images in single database ..... ideally i had to get only one image per database but i got two images in few of them hence instead of 256 database this code created 175 or so databases.

indexing::IndexReturnValue ForwardDatabaseAccessor::index(cv::Mat image, const std::stringreturn db->index(image, imageName, indexCameraType, recogCameraType); } In file LastDatabaseTndexingPolicy we have this function GetDatabaseToIndex as follows:---- DatabaseAccessorptr LastDatabaseIndexingPolicy::GetDBToIndex() { int numDBs; std::string dbName; sizet totNoOfIndexedImagesInDB; DatabaseAccessorptr db; std::vector::iterator endIter; { READINGLOCK(lock, adbMutex); numDBs = this->associateDBs->GetNumberOfAssociateDBs(); endIter = this->associateDBs->end(); endIter--; } if (numDBs == 0) { std::string newDBName = this->CreateAssociateDBs(numDBs); { WRITINGLOCK(lock, dbMutex); db = dbGroup.getDatabase(newDBName); return db; } } else { WRITINGLOCKADV(writeLock, dbMutex); totNoOfIndexedImagesInDB = dbGroup.getDatabase(*endIter)->size(); if (totNoOfIndexedImagesInDB >= (this->maxNumberOfImagesDBCFG)) { writeLock.unlock(); std::string newDBName = this->CreateAssociateDBs(numDBs); { WRITINGLOCK(lock, dbMutex); db = dbGroup.getDatabase(newDBName); return db; } } else { db = dbGroup.getDatabase(*endIter); return db; writeLock.unlock(); } return db; } } std::string IndexToLastDB::CreateAssociateDBs(int numDB) { std::ostringstream convert; convert dbName + "serverfwd" + convert.str(); std::string dbproperties = "type=ripe"; LOG(info,dbName) AddAssociateDB(newDBName); } { WRITINGLOCK(fileLock, fileMutex); util::serialization::save( *this->associateDBs, dbFile.string(), serializationFormat); } return newDBName; }
Full Post

No comments:

Post a Comment