我有一个SyncSet模板类,它锁定了set操作。当我做压力测试时,我崩溃了。当我检查崩溃输出文件时,似乎原因是关于set容器的find函数。您可以在下面看到我的模板类,并且可以在pastebin链接中达到相关的崩溃输出:http://pastebin.com/1JzAWxjf设置容器的find()发生崩溃
我的模板类中是否有错误可能导致此类崩溃?其次,操作系统中止应用程序是否可行,因为内存限制超过或类似的东西,那么是否有办法检查OS上的消息(Windows 7专业版)?
所有的建议和意见都是很好的和appricated。
谢谢。
template <typename T>
class SyncSet
{
public:
SyncSet() {
InitializeCriticalSection(&m_lock);
}
~SyncSet() {
DeleteCriticalSection(&m_lock);
}
void Insert(T elem) {
EnterCriticalSection(&m_lock);
m_set.insert(elem);
LeaveCriticalSection(&m_lock);
}
bool Has(T elem) {
if (m_set.empty() || m_set.find(elem) == m_set.end())
return false;
return true;
}
bool Erase(T elem) {
if (!Has(elem))
return false;
EnterCriticalSection(&m_lock);
m_set.erase(elem);
LeaveCriticalSection(&m_lock);
return true;
}
size_t Size() {
return m_set.size();
}
void Clear() {
EnterCriticalSection(&m_lock);
m_set.clear();
LeaveCriticalSection(&m_lock);
}
private:
std::set<T> m_set;
CRITICAL_SECTION m_lock;
};
当您对此进行压力测试时,您能否谈谈您用于模板参数T的类?如果是这样,请小心将它发布在你的问题中?此外,这段代码中有几个地方应该传递const引用。最后,'Erase()'不需要检查'Has()',如果使用多线程,'Has()'也应该用对象临界区来守护。 – WhozCraig 2013-03-20 22:39:41
您的测试是否为多线程?如果是,那么你应该在'Has'函数中锁定/解锁。顺便说一句,你不需要检查'空'在它 – borisbn 2013-03-20 22:43:51
它是多线程。 Pastebin链接清楚地显示了一个包含'ThreadFunc @ Thread @ CompanyInternal'的恶意调用堆栈。 – WhozCraig 2013-03-20 22:44:32