我使用映射作为特定于线程的缓存来跟踪失败的 LDAP 搜索。我使用 pthread_setspecific 动态分配映射并存储指针。在检查缓存或增加失败计数时,我使用 pthred_getspecific 来检索 void* 指针和 static_cast 将指针返回到我的映射类型。使用 [] 运算符调用地图似乎不会影响地图的状态,并且对 map->size() 的调用总是返回 0。感觉我可能错误地使用了 pthread_getspecific 但从我的示例中看着我的代码看起来不错。
代码:
typedef std::map<std::string, int> FailedSearchCacheMap;
/**
* Create the keyserver failed search cache key. Only called
* internally and may only be called once per thread.
*/
static void
sCreateKeyserverFailedSearchCache(void)
{
// Create the key used in refrencing the cache.
// sFreeKeyserverFailedSearch called against the pointer when the thread exits
pthread_key_create(&sFailedSearchCacheKey, sFreeFailedSearchCache);
}
/**
* Get the keyserver failed search cache (also create one if it doesn't exist)
*/
static FailedSearchCacheMap *
sGetKeyserverFailedSearch(void)
{
// Initializes the failed search cache key.
// pthread_once guarantees that the create key routine is only called once
static pthread_once_t sKeyserverFailedSearchOnce = PTHREAD_ONCE_INIT;
pthread_once(&sKeyserverFailedSearchOnce, sCreateKeyserverFailedSearchCache);
FailedSearchCacheMap* cache = static_cast<FailedSearchCacheMap *>(pthread_getspecific(sFailedSearchCacheKey));
if (IsNull(cache))
{
cache = new FailedSearchCacheMap();
pthread_setspecific(sFailedSearchCacheKey, cache);
}
return cache;
}
测试代码:
FailedSearchCacheMap* map_ptr1 = sGetKeyserverFailedSearch();
FailedSearchCacheMap* map_ptr2 = sGetKeyserverFailedSearch();
std::string ks("hostname");
FailedSearchCacheMap map1 = *map_ptr1;
FailedSearchCacheMap map2 = *map_ptr2;
int numFailedSearches = map1[ks] + 1;
map1[ks] = numFailedSearches;
std::cout << "numFailedSearches: " << numFailedSearches << std::endl;
std::cout << "map_ptr1 address: " << map_ptr1 << std::endl;
std::cout << "map_ptr2 address: " << map_ptr2 << std::endl;
std::cout << "map_ptr1->size(): " << map_ptr1->size() << std::endl;
std::cout << "map_ptr2->size(): " << map_ptr2->size() << std::endl;
std::cout << "map1.size(): " << map1.size() << std::endl;
std::cout << "map2.size(): " << map2.size() << std::endl;
FailedSearchCacheMap::iterator i = map1.begin();
for(; i != map1.end(); i++)
std::cout << (*i).first << ":" << (*i).second << std::endl;
测试代码输出:
numFailedSearches: 1
map_ptr1 address: 0x909ce88
map_ptr2 address: 0x909ce88
map_ptr1->size(): 0
map_ptr2->size(): 0
map1.size(): 1
map2.size(): 0
hostname:1