当C++遇到IOS应用开发---LRUCache缓存(2)

来源:未知 责任编辑:责任编辑 发表时间:2014-01-20 07:51 点击:

        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的对象缓存,最终代码修改如下:

[cpp] 
#ifndef _MAP_LRU_CACHE_H_ 
#define _MAP_LRU_CACHE_H_ 
 
#include <string.h> 
#include <iostream> 
#include "rwlock.h" 
#include <stdio.h> 
#include <sys/malloc.h> 
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 <class key_t> 
struct hashkey_compare{ 
    bool operator()(key_t x, key_t y) const{ 
        return x < y; 
    } 
}; 
        

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • Lexical or Preprocessor Issue 'xxx.h
  • ios学习笔记(二)xcode 4.3.2下实现基本交互
  • ios版本的helloworld
  • iphone(object-c) 内存管理(3) 有效的内存管理 前半部分
  • ios学习笔记(一)xcode 4.3.2下创建第一个ios项目
  • UITableView一些方法
  • IOS类似iphone通讯录TableView的完整demo【附源码】
  • [iPhone中级]iPhone团购信息客户端的开发 (二)
  • iphone(object-c)内存管理(1)
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1