幾個星期前我有一堂課,我的解決方案很好,但是當觀察它更長時間時,我注意到了一些奇怪的行爲。 該練習使用兩個posix線程產生死鎖,然後解決它。 (我抽象的解決方案,因此它沒有任何不必要的代碼解決死鎖時的奇怪行爲
的場景如下:
- 我有誰共享兩個虛構的資源兩個線程
- 兩個線程啓動序列,然後設法佔領這兩個資源(按順序太)
- 兩個線程都擁有佔領
- 當一個線程都有他的作品持續5秒兩種資源不同的時間跨度,然後釋放該資源,並在他再次開始需要休息,當斷則試圖佔據這兩個資源
- 每8秒功能checkes如果兩個線程都等待狀態(這兩個線程都一個資源,並等待第二次)
- 死鎖時occures,誰的工作更線程得到取消,然後重新啓動
問題出在這裏,這取決於機器和編譯器標記輸出說,例如線程A被取消,但線程B啓動。我用不同的編譯器在不同的計算機上試過它,並使用不同的關係。 奇怪的是,我編譯gcc -Wall -Werror -ansi -pedantic -D_POSIX_C_SOURCE=200809L -pthread -lrt
,並與第二死鎖問題occures,但是當我刪除-Wall和-Werror問題自帶的3僵局0O
我上傳的源here。編譯標誌位於源代碼中,我嘗試了gcc和clang。 我也試過Ubuntu 13.04和Arch。
Here是輸出,我用「 - >」標記了行
我忘記了一些東西,所以這個效果出現了嗎?我不認爲在某些庫中有錯誤。
我沒有得到你同樣的效果。你可以發佈你看到的輸出嗎? –