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

1

考虑改用读写锁,这里pthread_rwlock_t 有一些细节 它说

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

绝大多数线程只是简单地读取数据的情况呢?如果是这种情况,那么我们不应该关心临界区是否同时有 1 个或最多 N 个读者。事实上,我们通常唯一关心独占所有权的情况是当作者需要访问代码部分时。”

于 2013-08-06T11:11:38.667 回答
0

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

于 2013-08-06T11:10:03.893 回答