当一个线程锁定一个大地图时,如何避免冻结其他线程

时间:2013-08-06 10:54:35

标签: c++ linux multithreading stl mutex

如何避免冻结试图访问当前线程锁定的同一映射的其他线程?见下面的代码:

           //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
           }

2 个答案:

答案 0 :(得分:1)

请考虑使用读写锁,pthread_rwlock_t 有一些细节here 它说

  

“使用普通的互斥锁,当线程获得所有其他互斥锁时   线程被强制阻塞,直到所有者释放该互斥锁。

     

绝大多数线程的情况如何呢?   读数据?如果是这种情况,那么我们不应该在意   在关键部分同时是1个或最多N个读者。在   事实上,我们通常唯一关心的是独家所有权   当作者需要访问代码部分时。“

答案 1 :(得分:0)

您有一个std::string作为密钥。你能用短后缀(可能只是一个字母)和其余部分来分解那个键吗?因为在这种情况下,您可以将此数据结构实现为具有255个锁的255个映射。这当然意味着大部分时间都没有锁争用,因为后缀不同,因此锁定。