簡體   English   中英

Mac OS X中是否有等效的PTHREAD_MUTEX_ROBUST?

[英]Is there PTHREAD_MUTEX_ROBUST equivalent in Mac OS X?

我在共享內存上使用帶有PTHREAD_PROCESS_SHAREDpthread_mutex_t在不同進程之間進行同步。

如果進程退出但互斥鎖處於鎖定狀態,則互斥鎖可能會死鎖。 POSIX標准中有一個PTHREAD_MUTEX_ROBUST 但是,似乎Mac OS X不支持PTHREAD_MUTEX_ROBUST

Mac OS X上是否有某種mutex可以在共享內存上使用,並且可以用於同步跨進程,並且在進程死機而沒有解鎖的情況下保持健壯性?

強大的功能出現在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

看門狗每五秒鍾有效地鎖定和解鎖互斥鎖一次,每次都增加一個變量。 如果由於某種原因導致死鎖, thread2將停止並且該變量將永遠不會更新。

同時, thread1正在檢查以確保thread2仍在運行,方法是每分鍾對變量的本地副本進行檢查。 如果發現它們相同,則假定thread2由於死鎖而停止運行,然后通過使用互斥鎖關閉所有進程並銷毀它(通過刪除共享內存)來清理所有內容。

然后看門狗可以退出,並且可能啟動某個應用程序的任何代碼都會在某個時候啟動。 或者,您可以讓看門狗進程在退出之前發出某種警報,以確保問題得到解決。

看門狗程序背后的想法是使它盡可能地簡單,希望可以證明它是正確的(或者至少比錯誤的程序更正確)。

毫無疑問,取決於您的整體體系結構,還有許多其他可能性。 我剛剛提供了這些建議,讓您有所思考。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM