2

現在のスレッドによってロックされている同じマップにアクセスしようとする他のスレッドのフリーズを回避するにはどうすればよいですか? 以下のコードを参照してください。

           //pseudo code
           std::map<string, CSomeClass* > gBigMap;
           void AccessMapForWriting(string aString){
                 pthread_mutex_lock(&MapLock);

                 CSomeClass* obj = gBigMap[aString];
                 if (obj){
                       gBigMap.erase(aString);

                       delete obj;
                       obj = NULL;
                 }


                 pthread_mutex_unlock(&MapLock);
           }

           void AccessMapForReading(string aString){
                 pthread_mutex_lock(&MapLock);
                 CSomeClass* obj = gBigMap[aString];

                 //below code consumes much time
                 //sometimes it even sleeps for milliseconds
                 if (obj){
                     obj->TimeConsumingOperation();
                 }

                 pthread_mutex_unlock(&MapLock);
           }

           //other threads will also call 
           //the same function -- AccessMap
           void *OtherThreadFunc(void *){
                 //call AccessMap here
           }
4

2 に答える 2