【发布时间】:2010-10-01 04:26:15
【问题描述】:
问题:我需要编写一个函数,该函数从地图中返回输入键的值。如果函数在 map 中找不到值,它将从数据库中获取值,写入 map 以供将来使用并返回相同的值。可以有多个线程调用这个函数。
我在想这条线:
string GetData (const int key)
{
pthread_rwlock_rdlock(&rwlock); //read lock
string result = "not found";
my_map::const_iterator iter = m.find(key);
if ( iter != m.end() )//found
{
result = iter->second;
}
else //missing
{
pthread_rwlock_wrlock(&rwlock); // write lock
//fetch value from data base
//if successful, add to the map
m[key] = "missing data";
result = "missing data";
pthread_rwlock_unlock(&rwlock); // unlock write lock
}
pthread_rwlock_unlock(&rwlock); // unlock read lock
return result;
}
这个函数线程安全吗?两个或多个线程是否有可能在写锁上排队并从数据库中查询相同的键?如果是,我该如何避免这种情况?
【问题讨论】:
-
当您实现任何需要线程同步的算法时,我会参考的第一个资源是The Little Book of Semaphores。它确实是常见(但不那么常见)同步模式的绝佳参考。
-
感谢大家的cmets。我会与 James 的建议一起去从 map 读取后释放读锁,并在获取写锁后仔细检查元素是否已经存在于 map 中。
标签: c++ multithreading stl pthreads