Browse Source

Fixed LRU Cache API issue, now support multi-threading.

master
antpy 5 years ago
parent
commit
d664efa333
  1. 31
      src/LRUCache.h
  2. 2
      tests/LRUCache-test.cpp

31
src/LRUCache.h

@ -6,13 +6,16 @@ @@ -6,13 +6,16 @@
#include <list>
#include <utility>
#include <iostream>
#include <memory>
#include <mutex>
template<class K, class V>
class LRUCache {
using Key_list = std::list<std::pair<K, V>>;
using Key_list = std::list<std::pair<K, std::shared_ptr<V>>>;
Key_list key_values;
std::unordered_map<K, typename Key_list::iterator> positions;
size_t max_values;
std::mutex cache_mutex;
void remove_oldest() {
while (positions.size() >= max_values) {
@ -25,17 +28,30 @@ public: @@ -25,17 +28,30 @@ public:
LRUCache(const size_t max_values) : max_values(max_values) {
}
template<class VV>
void insert(const K& key, VV&& value) {
void insert(const K& key, std::shared_ptr<V> value) {
std::lock_guard<std::mutex> lock(cache_mutex);
remove_oldest();
key_values.emplace_front(key, value);
positions[key] = key_values.begin();
}
std::pair<V*, bool> find(const K& key) {
void insert(const K& key, V* value) {
insert(key, std::shared_ptr<V>(value));
}
void insert(const K& key, V&& value) {
insert(key, std::make_shared<V>(std::move(value)));
}
void insert(const K& key, V& value) {
insert(key, std::make_shared<V>(value));
}
std::shared_ptr<V> find(const K& key) {
std::lock_guard<std::mutex> lock(cache_mutex);
auto p = positions.find(key);
if (p == positions.end())
return {nullptr, false};
return {};
auto iter = p->second;
auto& value = iter->second;
// If the iterator is not at the front of the list, move it there.
@ -47,12 +63,13 @@ public: @@ -47,12 +63,13 @@ public:
std::next(iter));
}
positions[key] = key_values.begin();
return {&(iter->second), true};
return iter->second;
}
void debug_cache() {
std::lock_guard<std::mutex> lock(cache_mutex);
for (auto& p : key_values) {
std::cout << p.first << ":" << p.second << std::endl;
std::cout << p.first << ":" << *p.second << std::endl;
}
}
};

2
tests/LRUCache-test.cpp

@ -7,7 +7,7 @@ using namespace std; @@ -7,7 +7,7 @@ using namespace std;
int main(int argc, char **argv) {
LRUCache<string, int> lru(4);
lru.insert("hello", 1);
lru.insert("hello", new int(1));
lru.insert("hi", 2);
lru.insert("where", 3);
lru.insert("are", 4);

Loading…
Cancel
Save