我有一个表存储一个像数据这样的关键值,这个关键值将会被频繁使用但很少更新。所以我想将必要的数据存储在内存中,并且只在更新到来时才更新它。什么是使用静态地图来缓存C++数据的推荐方式
下面是简单的代码显示我目前的解决方案。
kv.h
class kv
{
public:
string query(string key);
void update(string key, string value);
};
kv.cpp
#include "kv.h"
#include <map>
#include <mutex>
#include <thread>
static map<string, string> s_cacheMap;
static mutex mtx;
string kv::query(string key)
{
unique_lock<mutex> lock(mtx);
if (s_cacheMap.empty())
{
// load from db
}
auto it = s_cacheMap.find(key);
if (it != s_cacheMap.end())
{
return (*it).second;
}
return "";
};
void kv::update(string key, string value)
{
unique_lock<mutex> lock(mtx);
s_cacheMap.clear();
// write key value into db
};
此溶液
的问题这些代码将在iOS平台库的一部分由C++编写。该应用程序可能随时被系统或用户杀死。我可以在应用程序退出时收到通知,但在用户终止应用程序之前,我只有很短的时间才能清理。我无法保证这些线程在应用程序终止时仍然运行得到正确的结果,但我想确保它不会崩溃。
在应用程序生命周期结束时,这两个静态变量将被销毁。当这两个静态变量被销毁时,另一个线程尝试调用这两个方法,它将失败。
可能的解决方案
1 - 裹静态成方法等that
map<string, string>& getCacheMap()
{
static map<string, string> *s_cacheMap = new map<string, string>;
return *s_cacheMap;
}
2 - 使KV类如单
static kv& getInstance()
{
static kv* s_kv = new kv();
return *s_kv;
}
问题
除了这两个解决方案之外,还有其他解决方案吗?
在所有线程完成之前不要退出程序? – davidbak
我同意来自'davidbak'的上述评论,你应该确保所有的线程在破坏上述静态变量被销毁之前完成。这更多的是通过堆栈调用操作符的顺序问题,而不是有效使用静态映射或缓存数据。 –
@davidbak我在C++编写的iOS平台上提供了一个库。所以这个应用程序可能随时被系统或用户杀死。我可以在应用程序退出时收到通知,但在用户终止应用程序之前,我只有很短的时间才能清理。我无法保证这些线程在应用程序终止时仍然运行得到正确的结果,但我想确保它不会崩溃。 – 2power10