2015-01-17 33 views
2

當我用相同的函數創建兩個線程時,函數中的靜態變量是共享的嗎?他們在哪裏得救?因爲如果它們保存在主線程的靜態數據中,它們將被共享給兩個線程。線程的相互作用

代碼例如:

void fill_g_msg(void){ 
    pthread_t t1, t2; 
    pthread_create(&t1, NULL, thread_fill, 「first"); 
    pthread_create(&t2, NULL, thread_fill, 「second"); 
    // wait for both threads to finish 
    pthread_join(t1, NULL); 
    pthread_join(t2, NULL); 
} 


void* thread_fill(void *arg){ 
    int a; 
    if(strcmp((char*)arg, 「second」) == 0) { 
     a = 1; 
    } else { 
     a = 2; 
    } 
    return null; 
} 
+1

您的例子似乎沒有任何靜態變量。 –

+0

我的意思是「a」變量 ,它是靜態的嗎? – Moawiya

+1

不,每次函數調用都會得到自己的一組局部變量,除非明確地添加一個'static'。 –

回答

1

每個線程將要運行的功能的不同的「實例」,所以沒有,他們不會使用完全相同的變量「a」。

重新編輯:如果你正在線程正在運行的函數中聲明int a,那麼每個線程將有不同的副本。每個線程都有自己的堆棧,這就是它應該去的地方。

另外,我不確定你是否明白當你說靜態變量(也許你的意思是靜態本地)時你的意思。檢查出this post

+0

那麼變量「a」的確切位置在哪裏? – Moawiya

+0

不,我不是全球性的「a」。 – Moawiya

+0

重新編輯了我上面的答案,看看。 –

1

我是新來的多線程,我發現你的問題很有趣。 搜索了一下後,我發現了以下幾點:

據我所知,我的引用可能不是最好的(... wikipedia)來引用,但他們確實有一些你可能會覺得有用的信息。

引用維基百科:「線程本地存儲(TLS)是一種計算機編程方法,它使用局部於線程的靜態或全局內存。有時需要這樣做,因爲通常進程中的所有線程共享相同的地址空間,換句話說,當一個靜態或全局變量中的數據通常位於相同的內存位置時,當來自同一進程的線程被引用時,調用堆棧上的變量對於線程來說是本地的,因爲每個線程都有它的自己的堆棧,駐留在不同的內存位置。「

所以它說,正常線程共享靜態變量。所以我假設靜態變量完全位於靜態變量位於沒有多個線程的進程中的相同位置。我當然可能是錯的:-)

另外,如果你看看下面的GCC參考,你可能會發現你可以有TLS的線程特定的靜態變量。

我希望這個答案對你有一些用處。

祝你好運!

參考文獻:WikipediaGCC