我的程序崩潰隨機在一個小的情況下,我可以複製,但它在mlock.c從ntdll.dll中(這是一個VC++運行時文件)發生了,我看不到堆棧跟蹤。不過,我知道它發生在我的一個線程函數中。VC++ 2010:古怪的關鍵節錯誤
這是mlock.c代碼在程序崩潰:
void __cdecl _unlock (
int locknum
)
{
/*
* leave the critical section.
*/
LeaveCriticalSection(_locktable[locknum].lock);
}
的錯誤是「指定無效的句柄」。如果我看看locknum,它是一個大於_locktable大小的數字,所以這是有道理的。
這似乎涉及到臨界區的使用情況。我在我的線程中使用CRITICAL_SECTIONS,通過一個CCriticalSection包裝類及其相關的RAII後衛CGuard。兩個here的定義,以避免更多的混亂。
這就是會崩潰線程函數:
unsigned int __stdcall CPlayBack::timerThread(void * pParams) {
#ifdef _DEBUG
DRA::CommonCpp::SetThreadName(-1, "CPlayBack::timerThread");
#endif
CPlayBack * pThis = static_cast<CPlayBack*>(pParams);
bool bContinue = true;
while(bContinue) {
float m_fActualFrameRate = pThis->m_fFrameRate * pThis->m_fFrameRateMultiplier;
if(m_fActualFrameRate != 0 && pThis->m_bIsPlaying) {
bContinue = (::WaitForSingleObject(pThis->m_hEndThreadEvent, static_cast<DWORD>(1000.0f/m_fActualFrameRate)) == WAIT_TIMEOUT);
CImage img;
if(pThis->m_bIsPlaying && pThis->nextFrame(img))
pThis->sendImage(img);
}
else
bContinue = (::WaitForSingleObject(pThis->m_hEndThreadEvent, 10) == WAIT_TIMEOUT);
}
::GetErrorLoggerInstance()->Log(LOG_TYPE_NOTE, "CPlayBack", "timerThread", "Exiting thread");
return 0;
}
從何在CCriticalSection
?每個CImage
對象包含它使用經過CGuard
RAII鎖CCriticalSection
對象。此外,每CImage
含有CSharedMemory
對象,它實現的引用計數。爲此,它包含兩個CCriticalSection
的以及,一個用於數據,一個用於參考計數器。這些相互作用的一個很好的例子在析構函數看得最清楚:
CImage::~CImage() {
CGuard guard(m_csData);
if(m_pSharedMemory != NULL) {
m_pSharedMemory->decrementUse();
if(!m_pSharedMemory->isBeingUsed()){
delete m_pSharedMemory;
m_pSharedMemory = NULL;
}
}
m_cProperties.ClearMin();
m_cProperties.ClearMax();
m_cProperties.ClearMode();
}
CSharedMemory::~CSharedMemory() {
CGuard guardUse(m_cs);
if(m_pData && m_bCanDelete){
delete []m_pData;
}
m_use = 0;
m_pData = NULL;
}
任何人碰到了這樣那樣的錯誤?任何建議?
編輯:我看到一些調用堆棧:調用來自〜CSharedMemory。因此,必須有一些競爭條件存在
編輯:更多CSharedMemory代碼here
內存損壞? – 2011-08-19 15:21:32
這兩個班本身看起來很好。你能展示一些與你如何使用它們有關的代碼嗎?你確定構造函數在使用之前被正確地調用了嗎(構造函數沒有線程爭用?)。它們是否被動態分配(出於某種原因)? – Chad
你的班級與CRT代碼沒有任何關係,它使用Windows。調試線程競爭和堆腐敗從來沒有樂趣,祝你好運。 –