我有一個多線程應用程序,我使用pthreads和pthread_mutex_lock函數。我需要保護的唯一數據是在一個數據結構中。只有在寫入數據結構時才應用鎖,是否安全?或者我應該在讀或寫時使用鎖?使用pthreads讀取關鍵部分數據
我發現了一個類似於這個的問題,但它是針對Windows的,從這個問題來看,我的答案就是它沒問題。只是想確定。
編輯
跟進:所以我想在一個命令行參數並從中讀取(來自不同線程)傳遞。我還需要使用pthread_mutex_lock嗎?
我有一個多線程應用程序,我使用pthreads和pthread_mutex_lock函數。我需要保護的唯一數據是在一個數據結構中。只有在寫入數據結構時才應用鎖,是否安全?或者我應該在讀或寫時使用鎖?使用pthreads讀取關鍵部分數據
我發現了一個類似於這個的問題,但它是針對Windows的,從這個問題來看,我的答案就是它沒問題。只是想確定。
編輯
跟進:所以我想在一個命令行參數並從中讀取(來自不同線程)傳遞。我還需要使用pthread_mutex_lock嗎?
除非您可以保證原子寫入(您甚至不需要鎖定寫入),否則在讀取時必須應用鎖定。寫入需要超過1個週期才產生問題。
想象一下,如果你寫8個字節爲兩個4字節的寫入。如果另一個線程在寫入一半之後啓動,則讀取將讀取無效數據。它的這種情況常常會發生,但是當它發現了一個追蹤錯誤的地獄時。
是的,你需要鎖定讀取和寫入。
編譯器和CPU不一定以原子方式寫入結構中的字段。此外,你的代碼可能不會自動寫入,並且該結構可能在某些點上與其本身不同步。
如果您只需要共享一個整數值,則可以選擇使用原子整數。 GCC具有可以使用的原子屬性。這不像使用pthreads鎖那樣可移植。
您可以使用pthreads_rwlock_t
來允許「單寫入器或N讀取器」併發。但是如果你堅持使用pthread_mutex_lock
這個普通的數據結構,那麼就需要獲得它對於它所保護的共享數據結構的任何訪問權限,所以你可以將事物分解爲「一個讀寫器」併發性。
「最好」 - >「這是必要的」。所有訪問相關數據的軟件程序都需要遵守鎖定。 – 2009-09-21 16:22:05
謝謝你,編輯回答。 – Goz 2009-09-21 16:22:57