我有兩個.c文件(main.c和support.c)。首先編譯Support.c,然後編譯main.c並使用support.o鏈接。我在support.c中有幾個非靜態全局變量。在涉及多個.c文件時如何處理全局變量
support.c的全局變量是如何存儲的?如果main.c是多線程的並且有兩個線程調用support.c中的函數,他們是共享這些全局變量還是每個都有自己的副本?
我有兩個.c文件(main.c和support.c)。首先編譯Support.c,然後編譯main.c並使用support.o鏈接。我在support.c中有幾個非靜態全局變量。在涉及多個.c文件時如何處理全局變量
support.c的全局變量是如何存儲的?如果main.c是多線程的並且有兩個線程調用support.c中的函數,他們是共享這些全局變量還是每個都有自己的副本?
全局變量是一個全局變量,總是隻有一個變量,無論您編譯和鏈接程序的數量多少。如果多個線程同時訪問全局數據,則需要自己確保正確的同步。
獲取單獨的全局或塊靜態變量副本的唯一方法是聲明它在C11中引入的_Thread_local
。線程局部全局變量在線程啓動時被初始化,並且在線程被連接時被釋放。
我想你可能會混淆static
關鍵字的使用時,它適用於存在於C源代碼頂級(即任何函數或方法外)變量,VS當你在變量使用static
一個函數中,關鍵詞。
除非有你聲明它爲static
,否則在源代碼中聲明爲頂級的變量將是全局的。如果是static
,則該文件將僅爲本地。它控制變量的範圍。
如果您在函數內部聲明瞭static
,它將控制該變量的生命週期。在這種情況下,即使在函數調用退出之後,變量仍將保留在內存中,從而導致其值在多個函數調用中保持不變。
如果你聲明瞭一個全局變量(即它不是static
並且是源文件中的頂層),那麼在內存中總是隻有一個實例。在其他源文件中,您必須將其聲明爲extern
,以便鏈接程序知道要查找其對象文件中爲其他文件定義的內存位置,但內存中只有一個。
不要忘記將全局變量聲明爲volatile,否則編譯器可能不會意識到它們可以被另一個線程修改並進行不安全的優化。
volatile int g_example;
@KingsIndian:頭文件''定義了一個宏'thread_local',但你說得對,'_Thread_local'是更自然的關鍵字。 –