我有一個表存儲一個像數據這樣的關鍵值,這個關鍵值將會被頻繁使用但很少更新。所以我想將必要的數據存儲在內存中,並且只在更新到來時才更新它。什麼是使用靜態地圖來緩存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