2013-06-12 65 views
0

我有一個線程和進程的內存地址有關的問題。的問題是: - 在 正常呼叫一樣線程的堆棧地址和主進程

int func(int a, int b){ 
    int c; 
    c = a + b; 
    return c; 
}   

int main(){ 
    int ret = func(a,b); 
    return 0; 
} 

在上面的函數調用函數func,函數變量a和b將得到存儲在堆棧中。請糾正我,如果我錯了。

現在另一種情況是當我們從主進程創建線程時。

void * func(void *dummy_ptr){ 
    int c; 
    c = a + b; 
    pthread_exit(); 
}   

int main(){ 
    pthread_t id; 
    int ret = pthread_create(&id, NULL, & func(), NULL); 
    return 0; 
} 

我的問題是pthread_create的變量將被存儲在哪裏。它是否存儲在主堆棧或線程堆棧中。

+0

您的示例不會編譯,因爲您錯過了聲明'a'和'b'。 – alk

回答

1

pthread_create爲堆中新線程的堆棧分配空間。因此,func中的變量存儲在線程的堆棧中,該堆棧本身位於程序的堆中。

+1

是的,這是正確的。對於在pthread_create api中調用的函數func()變量,變量將被存儲在線程堆棧中,但是我們在API pthread_create()中傳遞的變量如pthread_t id,任何線程屬性和最後一個參數像一些整數或結構指針一樣傳遞。 – Prak

0

變量pthread_t id是本地的主,所以它必須在主棧上創建。

main執行完畢,並

  • 你沒有pthread_joinmain等到線程終止。
  • 線程未分離。

main退出導致所有其他線程abrubtly(殺死)終止。