有一天,我發現了關於並行線程互斥執行可能的錯誤一篇有趣的文章,隨後進行討論:pthreads互斥體實現中是否存在基本錯誤?
https://lwn.net/Articles/575460
我現在的並行線程庫(和一般的多線程編程)的知識是太可憐了我理解大部分的討論,但我必須承認這導致了一些令人不安的結論。這是否意味着當前pthreads mutex的實現確實存在嚴重缺陷,因此,Linux內核(無疑嚴重依賴於多線程代碼)可能會涌現出來源於該缺陷的嚴重錯誤?我一直認爲代碼是基本的,低級的和基本的,像基本的同步原語,比如互斥體已經過徹底的測試(甚至被證明是正確的)。相反,我們突然發現大家多年來沒有注意到的「特例」,包括Linus Torvalds在內的任何人都無法確定它在內核代碼中可能出現的頻率。 聽起來很恐怖,不是嗎?
無論如何,有什麼問題和它(本文是從2013年末)可能的解決方案的現狀如何?互斥體實施是否已更改爲涵蓋省略的特例?或者是否改變了庫文檔(POSIX標準?)以加強可以安全使用互斥體的條件?有沒有做過任何事情?學習pthreads庫是否有意義,如果它很可能是腐敗和不可靠的?或者,我對這個問題的理解是錯誤的,根本沒有問題?
鏈接的討論與POSIX互斥體無關。 POSIX互斥體是*用戶空間*對象。討論的內容是在* kernel *空間中運行的* kernel *鎖。另外我懷疑基本錯誤不在內核鎖中,它的使用方式是 - 釋放鎖之後釋放內存,這意味着等待鎖的第二個線程將獲得鎖,遞增有問題的引用計數,然後嘗試使用已釋放的內存。 –
@AndrewHenle Btw大多數互斥體(包括POSIX和C++ 11)明確允許該文章中描述的用法。 – Ivan
@Ivan我不確定你的觀點是什麼。曾經發布的C,C++和POSIX標準的每個版本都無法防止出錯代碼。你讀過整篇文章了嗎?使用位於該內存中的鎖來保護任何內存幾乎是不可能的,無論該鎖是POSIX互斥鎖,Linux內核鎖還是C++ 11互斥鎖。這種內存在鎖定期間不能被釋放,並且有***無法阻止另一個線程等待獲取線程在釋放鎖定後釋放的鎖定。這是一個錯誤。 –