2013-11-24 97 views
2

The Open Group的規格爲pthread_mutex_lock,pthread_mutex_trylock,pthread_mutex_unlock和朋友位於herePTHREAD_MUTEX_ *和PTHREAD_MUTEX_ERRORCHECK是否互斥?

該頁面列出了四個互斥屬性值:PTHREAD_MUTEX_NORMAL,PTHREAD_MUTEX_ERRORCHECK,PTHREAD_MUTEX_RECURSIVEPTHREAD_MUTEX_DEFAULT

所有的值是否相互排斥?在調試配置中,我們是否允許將OR這些值放在一起?例如,我想在Debug中進行完整的錯誤檢查,因此PTHREAD_MUTEX_ERRORCHECK | PTHREAD_MUTEX_RECURSIVE是一個有效的配置?

我問的原因是我抓到一個錯誤pthread_mutexattr_settype。我不確定它是否有效的配置和OS X的實現錯誤;或者它的無效配置和預期的標準行爲。如果它是OS X的錯誤,我仍然可以在其他平臺上的調試配置中享受增強的錯誤檢查。

回答

3

互斥量只能是一個「類型」。你不能合併它們。

這樣做確實沒有意義 - 無論如何 - PTHREAD_MUTEX_ERRORCHECK如果您嘗試重新鎖定已被同一線程鎖定的互斥鎖,則互斥鎖總是返回錯誤,而PTHREAD_MUTEX_RECURSIVE互斥鎖總是會成功。在其他錯誤檢查的情況下(解鎖另一個線程已鎖定的互斥鎖,並解鎖已解鎖的互斥鎖),PTHREAD_MUTEX_ERRORCHECKPTHREAD_MUTEX_RECURSIVE都具有相同的行爲(始終返回錯誤)。

這意味着你的PTHREAD_MUTEX_RECURSIVE互斥體應該保持同類型中的「調試」版本,但它可能是有意義的替代PTHREAD_MUTEX_ERRORCHECKPTHREAD_MUTEX_DEFAULTPTHREAD_MUTEX_NORMAL互斥。

+0

謝謝咖啡。 「在其他錯誤檢查的情況下......」 - 這是問題(對我來說)。當「錯誤檢查」生效時,我不知道會進行多少附加檢查。如果pthread以效率名義跳過一些檢查,那麼我希望執行這些檢查。我從來沒有理解過「讓我們快速做錯事」的思想。如果它壞了,那麼你做多快就沒關係了。 – jww

+0

@noloader:POSIX不允許在'PTHREAD_MUTEX_RECURSIVE'情況下省略錯誤檢查 - 'PTHREAD_MUTEX_RECURSIVE'和'PTHREAD_MUTEX_ERRORCHECK'之間的唯一區別是在已經持有的relock-a-mutex情況下會發生什麼情況。只有'PTHREAD_MUTEX_DEFAULT'和'PTHREAD_MUTEX_NORMAL'具有未定義行爲的情況。未定義的行爲案例背後的哲學是,正確的應用程序不應該支付檢查錯誤應用程序中的錯誤的間接成本。 – caf