我有一个锁定集合操作的 SyncSet 模板类。当我进行压力测试时,我崩溃了。当我检查崩溃输出文件时,原因似乎与设置容器的查找功能有关。你可以在下面看到我的模板类,你可以在 pastebin 链接中找到相关的崩溃输出:http://pastebin.com/1JzAWxjf
是不是我的模板类有什么问题可能导致这样的崩溃?其次,操作系统是否有可能因为超出内存限制或类似原因而中止应用程序,那么有没有办法在操作系统(Windows 7 专业版)上检查消息?
欢迎并采纳所有建议和意见。
谢谢。
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;
};
最佳答案
您的代码不是线程安全的,因为尽管您保护了临界区内对集合的所有写入,但您没有保护 Has() 中的读取。
因此,例如,当另一个线程删除整个集合时,压力测试可以在 Has() 调用的中途进行。
请注意,critical_Section 是一个门,它仅在其他 EnterCriticalSection() 调用时被检查,并且 Has 中的查找不使用它,因此当另一个线程位于临界区内时,那里的代码不会停止。
关于c++ - 在设置容器的 find() 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15536102/