穩健的東西出現在後續的POSIX線程(SUSv7)迭代中,而不是Mac OS X(即SUSv2)支持的標準的一部分。
Apple文檔不顯示pthread_mutexattr_setrobust
函數(或其等效函數get
),並且它們聲明它們基於SUSv2,因此可以解釋爲什麼您沒有它。
在固定問題方面,你可以考慮類似的使用atexit
處理程序來釋放任何資源你退出程序可能具備的。
或者另一種可能性是監視外部死鎖並在發現問題時進行清理。例如,有一個看門狗進程有兩個線程,如下所示。
thread1:
set variables gloabalNum and localNum to zero
start thread2
while true:
sleep 60 seconds
if globalNum == localNum:
exit while
end if
localNum = globalNum
end while
kill all processes using mutex
remove shared memory
exit process
thread2:
while true:
lock mutex
unlock mutex
increment globalNum
sleep 5 second
看門狗每5秒鎖定和解鎖互斥鎖,每次增加一個變量。如果出於某種原因,你會發生死鎖,thread2
將停止,變量將永遠不會更新。
與此同時,thread1
正在檢查以確保thread2
仍在運行,通過每分鐘檢查變量與本地副本。如果它發現它們是相同的,則假定thread2
由於死鎖而暫停,然後通過使用互斥鎖關閉所有進程並銷燬它(通過刪除共享內存)來清除所有內容。
然後看門狗可以退出,並且大概無論您已經擁有的用於啓動整個應用程序的任何代碼都會在某個時刻啓動。或者,您可以讓退出程序在退出之前發出某種警告,以確保問題得到解決。
監督過程背後的想法是儘可能簡單,希望能證明它是正確的(或至少比錯誤的程序更重要)。
毫無疑問,根據您的整體架構,還有許多其他可能性。我剛剛提供了幾個這樣的東西,讓你思考一下。
謝謝。我想知道是否有一個等同的函數以'OSxxx'或'NSxxx'開始可以完成互斥任務。而對於'atexit',我將確保如何處理Ctrl-C或崩潰。 –
@SswaterShi:不知道,對不起。我使用PThreads本身和一般的線程,但是OS X的_specifics_不是我的專業領域之一。 – paxdiablo