2010-06-23 57 views
1

我使用C語言和Linux作爲我的編程平臺。我的應用程序內存使用量正在增長,使用pthread

在我的用戶空間應用程序中。我用pthread創建一個線程。

int main() 
{ 
    pthread_t thread1, thread2; 
    pthread_create(&thread1, NULL, fthread1, NULL); 
    pthread_create(&thread2, NULL, fthread2, NULL); 

    return 0; 
} 

void *fthread1(void *ptr) 
{ 
    /* do something here */ 
    pthread_exit(NULL); 
} 

void *fthread2(void *ptr) 
{ 
    /* do something here */ 
    pthread_exit(NULL); 
} 

我的問題是,當我pthread_create的循環再創建兩個線程,我的應用程序內存佔用越來越大。

while(1) 
{ 
    pthread_create(&thread1, NULL, fthread1, NULL); 
    pthread_create(&thread2, NULL, fthread2, NULL); 
} 

我在VSZ列中使用Linux ps命令行工具確定內存使用情況。

看來我錯過了一些使用pthreads API的部分。我該如何讓我的應用程序不要使用太多的內存。

+1

您正在啓動線程,每個線程都有自己的堆棧。爲什麼你不希望內存使用量增長? – Stephen 2010-06-23 00:12:51

+0

但是如果線程已經完成(pthread_exit)呢。它使用的堆棧應該清除? – domlao 2010-06-23 00:16:16

+1

很難知道_right_答案是什麼,不知道你在做什麼,爲什麼。當然'while(1)pthread_create'不是你最好的選擇。 :)發佈的答案提供了一種可能的解決方案 – Stephen 2010-06-23 00:23:34

回答

5

當線程仍在運行/尚未啓動時,您可能會創建線程。這是未定義的行爲。 (閱讀:非常糟糕)

如果修改程序做:

while(1) 
{ 
    pthread_create(&thread1, NULL, fthread1, NULL); 
    pthread_create(&thread2, NULL, fthread2, NULL); 
    pthread_join(&thread1, NULL); 
    pthread_join(&thread2, NULL); 
} 

你會等待線程開始一個新的線程之前完成。

請注意,每個線程都有自己的調用堆棧和控制結構,並會消耗內存。最好限制應用程序中的線程數量,不要以快速方式創建和銷燬線程。

+2

我們的發明都在一個跳躍和見面! (比較馴服馴服)。 – 2010-06-23 00:19:45

4

循環圍繞創建新線程,確保本的人已經完成了前:比處理器快

while(1) 
{ 
    pthread_create(&thread1, NULL, fthread1, NULL); 
    pthread_create(&thread2, NULL, fthread2, NULL); 
    pthread_join(&thread1); 
    pthread_join(&thread2); 
} 

你正在創建的線程可以清除它們。

0

每個線程必須分離或連接。你不分離你的線程,你不會創建它們,而且你也不會加入它們。你的pthreads實現必須永遠保持線程,因爲它無法知道你永遠不想加入它們。

相關問題