2016-01-06 59 views
0

如果我試圖鎖定無效的pthread類型自旋鎖會發生什麼?該場景可能發生在使用樂觀同步的鏈表上,在每個節點上利用自旋鎖,在找到所需節點的階段和實際鎖定它們之間。當我找到它們時,我對它們有一個有效的參考,但是如果它們是例如在我能夠鎖定它們之前刪除?結果會試圖鎖定一個NULL指針 - 可以導致程序終止,還是隻會使pthread_spin_lock()返回一個特定的值?POSIX線程 - 試圖鎖定空自旋鎖

+1

如果通過刪除,你的意思不再是一個對象,那麼你可以肯定它是未定義的行爲。 – 2501

+0

這是我嘗試做的一個很好的問題 - 爲了進行大學練習,我被要求實施「樂觀同步」 - 也就是說,刪除和添加節點在沒有鎖的情況下搜索列表,在發現它們之後鎖定節點,以及然後在繼續之前確保鎖定節點在列表內仍然有效。但後者的驗證並沒有解決它看起來的主要問題 - 也就是說,查找和鎖定節點之間可能會發生一些事情。 –

回答

2

documentation已清除:如果使用未初始化的自旋鎖調用這些函數中的任何一個,則結果不確定。

刪除一個對象後,它應該被視爲處於未初始化狀態。 (也取決於在這種情況下刪除的定義是什麼,我們沒有說明,所以可能會有額外的注意事項。)

沒有指定如果將NULL傳遞給函數會發生什麼情況。它可能會返回EINVAL:如果實現檢測到由pthread_spin_lock()或pthread_spin_trylock()的lock參數指定的值未引用已初始化的旋轉鎖對象,則建議該函數失敗並報告[EINVAL ]錯誤。