我有一个多线程应用程序,它使用C++ STL hash_map
来存储键值对。该hash_map
定义如下:应用程序崩溃尝试在hash_map中查找记录
struct eqstr
{
bool operator()(const string& s1, const string& s2) const
{
return (s1 == s2);
}
};
typedef hash_map<string,UserData, hash<string>, eqstr> DataMap;
DataMap datamap;
在哪里,的UserData是具有
struct UserData
{
char id[4+1];
char date[20+1];
int mode;
};
在我的应用程序的简单结构类型,我有
bool found = true;
pthread_mutex_lock(&muCS);
DataMap::iterator itr;
itr = datamap.find(key); // key is a string
if (itr == datamap.end())
found = false;
pthread_mutex_unlock(&muCS);
应用程序运行时,我得到pstack核心显示如下:
--- called from signal handler with signal 11 (SIGSEGV) ---
ff31db18 assign__t18string_char_traits1ZcRcRCc (fc07b958, 877f48, 877f58, 2, 1, 662fc0) + 8
00263f24 c_str__Ct12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b0i0 (fc07b958, 83af88, fc07b0c8, 1a, ffbff778, fffc00) + 34
00346c34 __cl__Ct4hash1Zt12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b0i0RCt12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b0i0 (77fd59, fc07b958, ffffffff, fc07b0c8, 1a, 80808080) + 18
00346900 _M_bkt_num_key__Ct9hashtable6Zt4pair2ZCt12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b0i0Z8UserDataZt12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b0i0Zt4hash1Zt12basic_string3ZcZt18strin (77fd58, fc07b958, c005, fc07b0e2, 1, 1) + 1c
00346960 _M_bkt_num_key__Ct9hashtable6Zt4pair2ZCt12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b0i0Z8UserDataZt12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b0i0Zt4hash1Zt12basic_string3ZcZt18strin (77fd58, fc07b958, cc, fc551200, ff2c2030, 10000) + 28
00347140 find__t9hashtable6Zt4pair2ZCt12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b0i0Z8UserDataZt12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b0i0Zt4hash1Zt12basic_string3ZcZt18string_char_trai (77fd58, fc07b958, fc551a00, 6633d0, 2922e4, 6633d8) + 18
003469f0 find__t8hash_map5Zt12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b0i0Z8UserDataZt4hash1Zt12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b0i0Z5eqstrZt9allocator1Z8UserDataRCt12basic_s (77fd58, fc07b958, fc07b910, 0, 6633d0, 26a0bc) + 1c
因此,看起来在hash_map
内找不到STL字符串。 我有信号量的标准守卫,以确保相互排斥。 什么可能出错? 任何补救建议或任何解决方法将有很大帮助。你觉得hash_map
需要更改为一些更好的数据结构或任何其他解决方法来防止stl字符串崩溃? 在此先感谢。
为什么hash_map而不是一个正常的地图? – Michael
@Michael有O(1)插入期间使用散列,你觉得映射会更好,更安全 –
好hash_map不是标准库的一部分,我至少会尝试unordered_map(只有C++ 11 ) – Michael