2009-09-21 34 views
1

我有一個多線程應用程序,我使用pthreads和pthread_mutex_lock函數。我需要保護的唯一數據是在一個數據結構中。只有在寫入數據結構時才應用鎖,是否安全?或者我應該在讀或寫時使用鎖?使用pthreads讀取關鍵部分數據

我發現了一個類似於這個的問題,但它是針對Windows的,從這個問題來看,我的答案就是它沒問題。只是想確定。

編輯

跟進:所以我想在一個命令行參數並從中讀取(來自不同線程)傳遞。我還需要使用pthread_mutex_lock嗎?

回答

3

除非您可以保證原子寫入(您甚至不需要鎖定寫入),否則在讀取時必須應用鎖定。寫入需要超過1個週期才產生問題。

想象一下,如果你寫8個字節爲兩個4字節的寫入。如果另一個線程在寫入一半之後啓動,則讀取將讀取無效數據。它的這種情況常常會發生,但是當它發現了一個追蹤錯誤的地獄時。

+0

「最好」 - >「這是必要的」。所有訪問相關數據的軟件程序都需要遵守鎖定。 – 2009-09-21 16:22:05

+0

謝謝你,編輯回答。 – Goz 2009-09-21 16:22:57

1

是的,你需要鎖定讀取和寫入。

編譯器和CPU不一定以原子方式寫入結構中的字段。此外,你的代碼可能不會自動寫入,並且該結構可能在某些點上與其本身不同步。

如果您只需要共享一個整數值,則可以選擇使用原子整數。 GCC具有可以使用的原子屬性。這不像使用pthreads鎖那樣可移植。

4

您可以使用pthreads_rwlock_t來允許「單寫入器或N讀取器」併發。但是如果你堅持使用pthread_mutex_lock這個普通的數據結構,那麼就需要獲得它對於它所保護的共享數據結構的任何訪問權限,所以你可以將事物分解爲「一個讀寫器」併發性。