当前位置:  编程技术>c/c++/嵌入式

C++开发在IOS环境下运行的LRUCache缓存功能

    来源: 互联网  发布时间:2014-10-11

    本文导语:  本文着重介绍如何在XCODE中,通过C++开发在IOS环境下运行的缓存功能。算法基于LRU(最近最少使用)。有关lru详见: http://en.wikipedia.org/wiki/Page_replacement_algorithm#Least_recently_used 之前在网上看到过网友的一个C++实现,感觉不错,...

本文着重介绍如何在XCODE中,通过C++开发在IOS环境下运行的缓存功能。算法基于LRU(最近最少使用)。有关lru详见:
http://en.wikipedia.org/wiki/Page_replacement_algorithm#Least_recently_used
之前在网上看到过网友的一个C++实现,感觉不错,所以核心代码就采用了他的设计。
原作者通过两个MAP对象来记录缓存数据和LRU队列,注意其中的LRU队列并不是按照常用的方式使用LIST链表,而是使用MAP来代替LIST,有关这一点原作者已做了说明。

另外还有人将MRU与LRU组合在一起使用,当然如果清楚了设计原理,那么就很容易理解了。
考虑到缓存实现多数使用单例模式,这里使用C++的模版方式设计了一个Singlton基类,这样以后只要继承该类,子类就会支持单例模式了。其代码如下:
代码如下:

//
// SingltonT.h
//
#ifndef SingltonT_h
#define SingltonT_h
#include
#include
using namespace std;
using namespace std::tr1;
template
class Singlton {
public:
static T* instance();
void print() {
cout read,1);
if (lock->write) {//当已是写锁时,则去掉读锁记数器
__sync_sub_and_fetch(&lock->read,1);
} else {
break;
}
}
}
static inline void
rwlock_wlock(struct rwlock *lock) {
__sync_lock_test_and_set(&lock->write,1);
while(lock->read) {
//http://blog.itmem.com/?m=201204
//http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/Atomic-Builtins.html
__sync_synchronize();//很重要,如果去掉,g++ -O3 优化编译后的生成的程序会产生死锁
}
}
static inline void
rwlock_wunlock(struct rwlock *lock) {
__sync_lock_release(&lock->write);
}
static inline void
rwlock_runlock(struct rwlock *lock) {
__sync_sub_and_fetch(&lock->read,1);
}

这里并未使用pthread_mutex_t来设计锁,而是使用了__sync_fetch_and_add指令体系,当然最终是否如上面链接中作者所说的比pthread_mutex_t性能要高7-8倍,我没测试过,感兴趣的朋友也可以帮助测试一下。
有了这两个类之后,我又补充了原文作者中所提到了KEY比较方法的定义,同时引入了id来支持object-c的对象缓存,最终代码修改如下:
代码如下:

#ifndef _MAP_LRU_CACHE_H_
#define _MAP_LRU_CACHE_H_
#include
#include
#include "rwlock.h"
#include
#include
using namespace std;
namespace lru_cache {
static const int DEF_CAPACITY = 100000;//默认缓存记录数
typedef unsigned long long virtual_time;
typedef struct _HashKey
{
NSString* key;
}HashKey;
typedef struct _HashValue
{
id value_;
virtual_time access_;
}HashValue;
//仅针对HashKey比较器
template
struct hashkey_compare{
bool operator()(key_t x, key_t y) const{
return x < y;
}
};
template
struct hashkey_compare
{
bool operator()(HashKey __x, HashKey __y) const{
string x = [__x.key UTF8String];
string y = [__y.key UTF8String];
return x < y;
}
};
//自定义map类型
template
class lru_map: public map{};
class CLRUCache
{
public:
CLRUCache() : _now(0){
_lru_list = shared_ptr(new lru_map);
_hash_table = shared_ptr (new lru_map);
}
~CLRUCache(){
_lru_list->clear();
_hash_table->clear();
}
int set( const HashKey& key, const id &value )
{
HashValue hash_value;
hash_value.value_ = value;
hash_value.access_ = get_virtual_time();
pair< map::iterator, bool > ret = _hash_table->insert(make_pair(key, hash_value));
if ( !ret.second ){
// key already exist
virtual_time old_access = (*_hash_table)[key].access_;
map::iterator iter = _lru_list->find(old_access);
if(iter != _lru_list->end())
{
_lru_list->erase(iter);
}
_lru_list->insert(make_pair(hash_value.access_, key));
(*_hash_table)[key] = hash_value;
}
else {
_lru_list->insert(make_pair(hash_value.access_, key));
if ( _hash_table->size() > DEF_CAPACITY )
{
// get the least recently used key
map::iterator iter = _lru_list->begin();
_hash_table->erase( iter->second );
// remove last key from list
_lru_list->erase(iter);
}
}
return 0;
}
HashValue* get( const HashKey& key )
{
map::iterator iter = _hash_table->find(key);
if ( iter != _hash_table->end() )
{
virtual_time old_access = iter->second.access_;
iter->second.access_ = get_virtual_time();
//调整当前key在LRU列表中的位置
map::iterator it = _lru_list->find(old_access);
if(it != _lru_list->end()) {
_lru_list->erase(it);
}
_lru_list->insert(make_pair(iter->second.access_, key));
return &(iter->second);
}
else{
return NULL;
}
}

unsigned get_lru_list_size(){ return (unsigned)_lru_list->size(); }
unsigned get_hash_table_size() { return (unsigned)_hash_table->size(); }
virtual_time get_now() { return _now; }
private:
virtual_time get_virtual_time()
{
return ++_now;
}
shared_ptr _lru_list;
shared_ptr _hash_table;
virtual_time _now;
};
#endif

接下来看一下如果结合单例和rwlock来设计最终的缓存功能,如下:
代码如下:

using namespace lru_cache;
class DZCache: public Singlton
{
friend class Singlton;
private:
shared_ptr clu_cache;
rwlock *lock;
DZCache(){
lock =(rwlock*) malloc(sizeof(rwlock));
rwlock_init(lock);
clu_cache = shared_ptr(new CLRUCache());
cout get(hash_key);
if(value == NULL){
return nil;
}
else{
return value->value_;
}
}
};
#endif

最后看一下如何使用:
代码如下:

void testLRUCache(){
//指针方式
DZCache::instance()->set(@"name", @"daizhj");//设置
NSString* name = (NSString*)DZCache::instance()->get(@"name");//获取
std::cout

    
 
 

您可能感兴趣的文章:

  • 几个windows平台C++开发错误举例
  • 关于Linux下C++开发的问题
  • Linux 下c++开发error while loading shared libraries问题解决
  • 开发linux下的c++程序需要什么开发环境 ,最好推荐本书------关于网络的编程
  • Linux下的C开发和C++开发有什么区别吗?
  • 简单的C++开发工具 Sally
  • linux开发用c还是c++好啊
  • 如何用C++开发Apache的模块
  • C++集成开发环境 Code::Blocks
  • 各位在Unix下开发,使用哪种c++编译器?
  • C++的SVG开发包 wxSVG
  • linux下C++程序开发该从何开始?
  • C++异步网络开发库 ez_poll
  • LINUX c++开发 者交流1187953
  • C/C++集成开发环境 Dev C++
  • 请问高手在solaris上开发c++程序用什么呀,还是vi么!
  • C++开发的BLOG程序 xBlog
  • C++的BT协议开发库 LibTorrent
  • 急问Linux下最流行的C++开发环境是什么?
  • 用 C++ 开发 Python 扩展 PyCXX
  • JSON的C++开发包 CAJUN
  • android开发教程之清除android数据缓存示例(清除本地数据缓存)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • VS2012+MySQL+SilverLight5的MVVM开发模式介绍
  • linux 嵌入式开发用不用买开发板,买什么样的开发板?
  • ios app 开发中ipa重新签名步骤介绍
  • 请问shell 开发能开发什么样的程序?硬件的驱动程序是否能够开发呢?
  • IOS开发:UIScrollView类介绍及如何简单地截获touch事件
  • 请问在Linux 下用C开发移动增值软件都有什么开发工具啊,我以前一直在Windows下用VC开发
  • nginx最新主线开发版1.5.4发布及下载地址
  • 我常未开发过Linux下的程序,请问Linux下可以使用那些开发工具,最好的开发工具是什么版本?
  • Web前端开发如何利用css样式来控制Html中的h1/h2/h3标签不换行
  • 我是学习web开发的,主要是java开发SSH开发框架和ajax等。我想知道有没有必要学习一下linux相关知识。
  • ​基于Docker的大数据开发实践
  • 各位设备驱动开发的朋友,请问,linux设备驱动开发和网络编程开发哪一样工资比较高呀?
  • Android及andriod无线网络Wifi开发的几点注意事项
  • Linux Kernel/Network 技术QQ群14888802,只加有内核开发、TCP/IP协议栈开发的程序员,不加新手和做应用开发的程序员。
  • Android开发需要的几点注意事项总结
  • 驱动程序开发和嵌入式开发有什么联系吗?
  • IOS开发之socket网络编程(基于SimpleNetworkStreams的c/s程序)
  • linux 嵌入式开发用买开发板吗?
  • c/c++ iis7站长之家
  • web开发和嵌入式开发哪个更有挑战
  • 请问在哪下载嵌入式Linux开发平台???想学嵌入式开发!!!




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3