【发布时间】:2013-08-06 10:54:35
【问题描述】:
如何避免冻结其他试图访问被当前线程锁定的同一张地图的线程?见以下代码:
//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
}
【问题讨论】:
-
可以看一下pthread_mutex_trylock:linux.die.net/man/3/pthread_mutex_trylock
-
所有线程都会调用同一个函数——AccessMap
-
如果您只是锁定以阅读地图,则不需要锁定,尽管我怀疑我可能会遗漏一些东西。
-
@doctorlove 某些线程可能会访问地图以从中删除一些元素,但这种情况很少发生,但访问地图以进行阅读却经常发生。
-
@doctorlove 请记住,通过
operator[]“阅读”地图也可能意味着写作。
标签: c++ linux multithreading stl mutex