2012-05-06 132 views
0

我有一個帶有多個pthread的程序。這些線程通過在公共文件中獲取和設置函數將數據報告回靜態變量。同時讀取和寫入變量

static int LAT; 
void getLat(){ 
    return LAT; 
} 
void setLAT(int lat){ 
    LAT = lat; 
} 

如果一個線程執行getLAT();,另一個在同一時間執行setLAT();會發生什麼?我的程序會崩潰嗎?如果是這樣,我該如何防止呢?

+1

它不會崩潰,但不可能告訴你得到什麼價值。從字面上看,這是一種競爭條件。 –

+0

它會獲得除了正在設置的東西,還是已經存在的東西? – Reid

+0

您是否錯過了'LAT'的類型聲明? – gcbenison

回答

3

這被稱爲競態條件並導致未定義的行爲。什麼事情都可能發生。崩潰不太可能發生,更可能的情況是結果可能是寫入之前,寫入之後或者寫入中間值已損壞。

如果您嘗試在系統調用中使用該損壞的值或作爲指針偏移量等,則會在該點崩潰。一些平臺和體系結構將保證特定大小的對象與特定地址對齊的原子讀/寫(例如,如果與16字節地址對齊,原子4字節讀取等),在這種情況下,中間值(損壞) 不會發生。但是你不能真正依靠這種行爲,因爲它不可移植。即使這種行爲沒有得到保證,你的代碼很可能會在99%的時間內正常運行,除非生產中有1%的時候你希望你沒有采取快捷方式並且不會爲同步而煩惱。

您需要使用一個互斥或原子讀/寫指令(如cmpxchg)來保護您的代碼免受這種競爭條件的影響。

+0

我會如何防止這種情況? – Reid

+0

查看我的更新回覆。 –

+0

謝謝。這有幫助。 – Reid