Browse Source

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

master
antpy 2 years ago
parent
commit
d664efa333
2 changed files with 25 additions and 8 deletions
  1. 24
    7
      src/LRUCache.h
  2. 1
    1
      tests/LRUCache-test.cpp

+ 24
- 7
src/LRUCache.h View File

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

+ 1
- 1
tests/LRUCache-test.cpp View File

@@ -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