2011-05-12 183 views
3

我需要一個字符串作爲全局變量。多線程可能會設置全局變量。我應該去爲這個互斥體嗎?或者操作系統會處理這些操作。 去互斥會影響應用程序的性能。在線程中設置全局變量

我不關心行爲發生的順序。我害怕數據損壞。 有人可以讓我知道這件事。

回答

1

這聽起來像你理解所有的關注。如果全局變量可能會損壞,那麼您肯定需要將其鎖定在互斥體中。這將影響性能,因爲這部分現在定義爲同步。也就是說,您需要根據需要鎖定最小部分的代碼,以最小化同步代碼被調用的時間。

0

什麼是你的全局變量?一個指向字符串緩衝區的指針,還是緩衝區本身?

在許多體系結構(包括AFAIR 32位x86)上覆蓋單個指針是原子的。

這個例子可能工作:

volatile char **global_var; 

void set_var(char *str) { 
    char *tmp = strdup(str); 
    global_var = &tmp; 
} 
+1

還可以考慮使用平臺API提供的任何原子函數(例如,Win32上的InterlockedExchange()) – 2011-05-12 12:16:50

+0

您可能需要舊值才能將其釋放。在這種情況下,您必須使用互鎖交換。 – wj32 2011-05-12 12:17:39

+0

@Tadeusz:你說得對。我錯過了添加,設置全局變量字符串不是賦值。它是一個字符串副本,這是我的擔心。理解指針的原子性概念。我甚至嘗試過使用一個全局的字符串變量和2個線程作爲示例,它適用於每個不同的運行而沒有數據損壞。無論如何,我可以從運行中聲明。 – 2011-05-12 12:17:58

0

您可以使用Thread-Local Storage這一點。
不幸的是,它沒有在當前的C99標準中指定,但可能會在C1X中。目前,您可以使用特定於編譯器的實現(GCC,ICC和Visual C)。

+0

我不認爲提問者想要線程本地存儲;似乎所有線程共享的全局變量是期望的。 – 2011-05-12 12:12:18

0

就標準而言,是的,您必須使用互斥鎖。不這樣做會導致未定義的行爲。在實踐中,大多數機器架構對此沒有任何問題。 C標準(C1x)的未來版本將具有原子類型,如果在此處使用,它將確保在沒有鎖定的情況下安全地進行分配(雖然可能使用內部鎖定,但在沒有真正原子的破碎拱門上)。