解決 Windows has triggered a breakpoint in Linkage.exe問題
阿新 • • 發佈:2019-01-06
這兩天在做一個小專案,裡面有多執行緒的東東,在除錯的時候 總是遇到 Windows has triggered a breakpoint in Linkage.exe 的錯誤。現在將這個問題和大家分享一下。
前提是這樣的:
我要從資料庫裡面查詢裝置,然後找了一組裝置之後,就要迴圈開啟每一個的連線:
for (int i=0;i<records;i++) //records代表記錄集條數 { CString strCameraID; strCameraID=CString(Anita::UTF8Tostring((char*)LResult.rows[i][0].c_str()).c_str()); TDev* p = new TDev; //TDev 是我的裝置結構體 strcpy_s(p->id, Anita::UTF8Tostring((char*)LResult.rows[i][0].c_str()).c_str()); p->StartThread(); }
bool StartThread()
{
m_bStart = true;
m_pWorkerThread = AfxBeginThread(TDev::ProcessThreadProc, (void*)this,
THREAD_PRIORITY_NORMAL);
if(!m_pWorkerThread)
return false;
return true;
}
執行緒函式如下:
static UINT ProcessThreadProc(LPVOID pParam) { TDev* pThis = reinterpret_cast<TDev*>(pParam); ::OleInitialize(NULL); while(pThis->m_bStart) { pThis->Work(); Sleep(30); } ::CoUninitialize(); TRACE("EXIT THREAD"); return 0xdead; }
按理說,這樣是沒有什麼問題的,先查詢裝置集合,然後一個一個地開啟執行緒開啟裝置連線。
可是在除錯的時候,時不時地彈出一個錯誤:
注意不是每回都彈出這個問題,是時不時地彈出!
開始的時候我也一頭霧水,還以為是別的什麼庫出了問題,找老大去說,他也隨便說了說。於是我還得自己找不是.
後來我經過測試發現,一開始不彈出這個heap corruption 的情況下,系統執行的都好好的,所以問題很有可能就出在最開始了,是不是開啟執行緒的時候就發生衝突了呢?
最後,我終於有了些發現,我那個執行緒函式那裡找到了這句:
這個 Sleep(30);很重要啊,它給了我靈感..pThis->Work(); Sleep(30);
執行緒的開啟需要申請地址等等,我的資料集合那邊的那個迴圈是不等待的(理論上)啊,這樣一來第一個還沒開始執行,第二個又開始了,假如後面的執行緒來申請地址或開始work的時候,前面的正好也在處理記憶體,這樣不就發生衝突了嘛?
於是我就在我的那個資料集迴圈那裡也來一個Sleep(),果然,這個問題就再也沒有彈出過。
至於此處應該Sleep()多久,我就寫了30毫秒,最好預留一些時間給CPU處理吧,30毫秒我想奔三也應該夠了吧。。
修改的程式碼:
for (int i=0;i<records;i++) //records代表記錄集條數
{
CString strCameraID;
strCameraID=CString(Anita::UTF8Tostring((char*)LResult.rows[i][0].c_str()).c_str());
TDev* p = new TDev; //TDev 是我的裝置結構體
strcpy_s(p->id, Anita::UTF8Tostring((char*)LResult.rows[i][0].c_str()).c_str());
p->StartThread();
Sleep(30);//開啟執行緒需要時間, 30毫秒 給 CPU,奔三也應該夠了吧?!
}
經過測試,我的問題解決了。至於文中的原理是不是完全正確,希望大家多提意見..