我有一個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