2014-10-20 111 views
0

我對C中的多線程是新手,想知道如何在線程間共享函數中聲明的共享(非全局和非靜態)變量。我知道,我們可以像線程如何知道共享變量的地址

a = (int *)malloc(sizeof(int)); 

聲明像

int a; 

或動態的既簡單變量共享data.But,目前尚不清楚什麼對我是如何在各種情況下的編譯器行爲?

1)它是否將在其線程堆棧內創建的變量的地址賦予其他線程?

2)如何動態分配變量?它的指針是否廣播?或者指針保存在.DATA或.BSS中的某個地方?

在此先感謝

+0

我不是一個熟練的人,但我認爲在單個OS進程中,所有線程共享相同的內存映射。在一個線程上分配的內存不在不同的位置,或者以不同的方式進行管理,從分配在任何其他線程上的內存中,對嗎?我意識到需要做的唯一的區別是單線程公寓(STA),其中需要一些限制來控制哪些函數被允許操縱在這些線程中創建的資源(窗口,圖形對象等)在另一個... – 2014-10-20 16:22:30

+0

每個線程都有自己的堆棧,但共享堆。 – user3684042 2014-10-20 16:28:38

+0

但是,不是每個線程的堆棧仍然是由OS發佈到所有線程駐留的進程所在的同一內存映射的一部分嗎?即如果一個線程具有來自另一個線程的變量的虛擬地址,則它不需要對操作系統進行「thunk」以獲得實際的物理地址來訪問它。 – 2014-10-20 16:35:10

回答

1

如何聲明你的變量以及它如何在一個線程處理是不是編譯器關心。決定如何分配它是你的工作。

例如,如果您已在堆棧中分配了int a,則需要確保該變量在任何訪問該線程的線程的生命週期內都能存活。這通常意味着在變量超出範圍之前加入任何線程。

如果你在堆上分配變量,那麼你的線程可以訪問這個變量,而不必擔心內存超出了範圍。但是,您需要決定如何釋放由malloc分配的內存。一個線程將需要成爲內存的「所有者」,並調用free來對付它,否則會產生內存泄漏。

將指針傳遞給線程將取決於您使用的平臺和線程庫。但是,它們都允許您傳遞某種參數,通常爲void*例如,pthread_create的第4個參數允許您將指針傳遞到您的線程函數中。

+0

謝謝。但是,我已經知道高級語言會發生什麼。我在尋找的是共享(非靜態和非全局)變量的位置是如何被其他線程知道的。 – user3684042 2014-10-20 16:26:10

+0

@ user3684042 - 夠公平的。我已經爲答案添加了更多信息。 – Sean 2014-10-20 16:29:35