如何避免冻结试图访问当前线程锁定的同一映射的其他线程?见下面的代码:
//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
}
答案 0 :(得分:1)
请考虑使用读写锁,pthread_rwlock_t
有一些细节here
它说
“使用普通的互斥锁,当线程获得所有其他互斥锁时 线程被强制阻塞,直到所有者释放该互斥锁。
绝大多数线程的情况如何呢? 读数据?如果是这种情况,那么我们不应该在意 在关键部分同时是1个或最多N个读者。在 事实上,我们通常唯一关心的是独家所有权 当作者需要访问代码部分时。“
答案 1 :(得分:0)
您有一个std::string
作为密钥。你能用短后缀(可能只是一个字母)和其余部分来分解那个键吗?因为在这种情况下,您可以将此数据结构实现为具有255个锁的255个映射。这当然意味着大部分时间都没有锁争用,因为后缀不同,因此锁定。