我会用这样的东西来包装 LongRunningOperationToFetchFactor 的实现。我正在使用 Boost 范围锁,但您可以使用与其他锁定框架类似的东西。
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <map>
using namespace std;
static boost::mutex myMutex;
static map<int,double> results;
double CachedLongRunningOperationToFetchFactor( int key )
{
{
boost::mutex::scoped_lock lock(myMutex);
map<int,double>::iterator iter = results.find(key);
if ( iter != results.end() )
{
return (*iter).second;
}
}
// not in the Cache calculate it
result = LongRunningOperationToFetchFactor( key );
{
// we need to lock the map again
boost::mutex::scoped_lock lock(myMutex);
// it could be that another thread already calculated the result but
// map assignment does not care.
results[key] = result;
}
return result;
}
如果这确实是一个长时间运行的操作,那么锁定 Mutex 的成本应该是最小的。
你的问题不是很清楚,但如果函数 LongRunningOperationToFetchFactor 是你类的成员函数,那么你希望映射是同一个类中的可变映射。不过,我使用单个静态互斥锁进行访问仍然足够快。