当前位置:  开发笔记 > 编程语言 > 正文

在C++中缓存昂贵的数据 - 函数范围的静态与可变成员变量

如何解决《在C++中缓存昂贵的数据-函数范围的静态与可变成员变量》经验,为你挑选了1个好方法。

我有一个相对昂贵的数据获取操作,我想缓存结果.从const方法调用此操作,大致如下:

double AdjustData(double d, int key) const {
  double factor = LongRunningOperationToFetchFactor(key);
  return factor * d;
}

我想AdjustData保留const,但我想缓存因素,所以我只是第一次获取它.目前我使用的是mutable map存储的结果(图被keyfactor),但我使用的功能范围的静态可能是一个更好的解决办法思考-这个因素只能通过此功能需要,而且是无关的其他同学.

这似乎是一个好方法吗?还有更好的选择吗?我可以考虑哪些事情,特别是在线程安全方面.

谢谢,

大教堂



1> Jeroen Dirks..:

我会用这样的东西包装LongRunningOperationToFetchFactor的实现.我正在使用Boost范围的锁,但你可以使用与其他锁定框架类似的东西.

#include 
#include 
#include 

using namespace std;

static boost::mutex myMutex;
static map results;

double CachedLongRunningOperationToFetchFactor( int key )
{

   {
       boost::mutex::scoped_lock lock(myMutex);

       map::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;
}

如果这确实是一个长期运行的操作,那么锁定互斥锁的成本应该是最小的.

你的问题不是很清楚,但如果函数LongRunningOperationToFetchFactor是你的类的成员函数,那么你希望map在同一个类中是可变映射.我单个静态互斥锁用于访问仍然足够快.

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有