2015-05-27 55 views
2

在我的簡單遊戲中,有一個線程可以繪製到屏幕上。當我按下ESC鍵時,我讓程序拋出一個退出信號作爲例外。只要發現這個異常,就會調用清理函數並退出程序。這種'預期'分段錯誤發生在清理功能被調用時,如果畫面沒有完成繪圖,並且繪圖線程有些孤立。我的Ubuntu Linux操作系統似乎可以安全地處理這個問題,並且不會崩潰,儘管它告訴我一個分段錯誤。你認爲可以這樣離開嗎?如果不是,我可能面臨什麼樣的嚴重問題?在這種情況下,我對系統內部發生的一切有點感興趣。安全分割錯誤?

+2

heh? 「安全地處理這件事並且不會崩潰,你是什麼意思,雖然它告訴我一個分段錯誤」? –

+2

此外,您可能想了解[未定義行爲](https://en.wikipedia.org/wiki/Undefined_behavior)。 –

+0

還有一個關於_recovering_ SIGSEGV的問題,這是不可能的。 –

回答

4

據我所知,主線程是釋放繪圖線程所使用的內存而沒有任何形式的同步,也就是說,主線程在繪圖線程寫入時可以釋放內存。

這並不安全,你絕對不應該這樣離開它。主線程上的退出處理程序應該停止繪圖線程,或者等待它完成,然後釋放內存。

正如您所描述的,您的代碼具有未定義的行爲。請注意,按預期工作是未定義行爲的有效形式 - 但這並不意味着它將始終按預期工作。任何事情都可能發生。

3

這種分段錯誤可能意味着您嘗試訪問內核設置的進程保留之外的內存。

您應該嘗試解決導致分段錯誤的問題,這是一個非常有用的內存分析工具,您可以從您的ubuntu存儲庫中安裝它。

1

這聽起來不像一個好的設計,實際上聽起來非常類似於Coding by exception反模式。最好讓線程將事件發回到主要步驟,並執行「加入」以進行受控關閉。

0

當你想退出程序時,你可以隱藏gui並嘗試標記所有正在運行的線程停止。在程序中調用退出之前,請先檢查循環,直到所有線程都以迭代超時停止。爲避免CPU過載,請在此循環中加入睡眠

+0

因爲你有更好的機制,所以在循環中休眠並不是最好的同步方式。 – zoska

+0

不適用於sincronization,但如果只檢查線程是否完成了工作,則可以在低優先級線程中使用循環,因此可以在此處添加睡眠。正如問題所說,問題不是sicronization,而是關閉應用程序的方式。爲了關閉一個多線程的應用程序,你需要確保所有的線程都完成了工作,所以這就是我所建議的標誌 –

+0

那麼,等待某種事件發生在不同的線程/進程通常是一個同步問題。主動等待(即使有睡眠)也不是最好的主意。 – zoska