1. 程式人生 > >QT程式除錯(資源死鎖問題)

QT程式除錯(資源死鎖問題)

最近動手在師兄寫的一個小的QT介面上添加了一點小的框架,在除錯的過程中程式會crash,找了很久的原因,終於找到的問題的存在,在這裡記錄一下,以防止以後會碰到類似的情況!

問題:程式crash的地方除錯顯示 Resource Deadlock,原因在於整個程式同時運行了兩個執行緒,其中一個是圖形介面MainWindow的執行緒,另一個則是定義的接收資料的執行緒,在圖形介面中有一個按鈕StopButton,它對應的訊號連線著槽stop();而在recv當中如果接收的資料出錯則也會呼叫stop()函式,這樣就有一個問題了,當你手動點選圖形介面的時候會出發訊號,因此呼叫stop()函式;而這時候如果接收函式沒有接收到相應長度的資料包時同樣會呼叫到stop()函式。在stop函式當中有對執行緒的join()以及delete操作,因此當重複呼叫stop()的話就會對建立的執行緒進行兩次join()以及delete(事實上程式只執行到join這一步就掛掉了),因此造成了資源死鎖的問題。

解決辦法:

    (1)在stop()函式里加鎖

    (2) 或者設定一個狀態量,在start()函式中設定狀態量m_run=ture,只有在m_run為真的時候才執行stop()函式中的操作,同時將m_run置為false,這樣就保證了stop()函式不會被同時執行兩次。

void NetUtil::stop()
{
    std::unique_lock<std::mutex> lock(m_stopMtx);   //加鎖
    if (m_run)
    {
        m_run = false;
        if (!sendCmd("\x1\x0", m_ip))
        {
            emit prompt("NETWORK ERROR", "failed to send stop command");
        }
        emit finish();
        m_readThread->join();
        delete m_readThread;

        if(m_save == true)
        {
        m_saveThread->join();               
        delete m_saveThread;
        }

    }
}