2014-10-27 93 views
-1

我有一個關於嵌入式系統中的C併發編程的問題,大約64Mb的RAM。 我特別希望減少由一個線程使用默認的內存,所以我定義:pthread_attr_setstacksize和pthread_exit

pthread_attr_t attr_test; 
size_t stacksize = 0x186A0; // 100Kbyte 
pthread_attr_init(&attr_test); 
pthread_attr_setdetachstate(&attr_test, PTHREAD_CREATE_DETACHED);  
pthread_attr_setstacksize(&attr_test, stacksize); 

所以,當線程啓動時,它僅使用虛擬內存的100Kbyte。 但是當線程結束並調用pthread_exit時,進程使用的虛擬內存迅速增加!...

爲什麼?我能做什麼?

謝謝!

UPDATE

主題 - >

void *thread_test(void *arg1) { 
    int *param; 
    param = (int*)arg1; 

    printf("Thread %d start\n", *param); 
    pthread_cond_wait(&condition[*param], &mutex[*param]); 
    printf("Thread %d stop\n",*param); 
    pthread_exit(0); 
} 

首頁 - >

int main(void) { 
    pthread_t IDthread[MAX_THREADS]; 
    int param[MAX_THREADS]; 
    int pointer; 
    int i, keyb; 
    void *stkaddr; 
    size_t stacksize; 

    puts("!!! THREAD TEST !!!"); 
    printf("Process ID %d\n\n", getpid()); 

    for(i=0; i<MAX_THREADS; i++) 
    { 
     pthread_cond_init(&condition[i], NULL); 
     pthread_mutex_init(&mutex[i], NULL); 
     IDthread[i] = 0; 
     param[i] = i; 

    } 

    stacksize = 0x186A0; // 100Kbyte 

    pthread_attr_init(&attr_test); 

    pthread_attr_setdetachstate(&attr_test, PTHREAD_CREATE_DETACHED); 
    /* setting the size of the stack also */ 
    pthread_attr_setstacksize(&attr_test, stacksize); 

    pointer = 0; 


    do { 
     keyb = getchar(); 
     if (keyb == '1') 
     { 
      if (pointer < MAX_THREADS) 
      { 
       pthread_create(&IDthread[pointer], &attr_test, thread_test, &param[pointer]); 
       sleep(1); 
       pointer++; 
      } 
      else 
       puts("MAX Threads Number"); 
     } 

     if (keyb == '2') 
     { 
      if (pointer != 0) 
      { 
       pointer--; 
       pthread_cond_signal(&condition[pointer]); 
       sleep(1); 
      } 
      else 
       puts("0 Thread is running"); 
     } 

    } while (keyb != '0'); 
    printf("FINE\n"); 
    return EXIT_SUCCESS; 

} 
+0

當內存使用量增加時,使用調試器和中斷來查看實際發生的情況。 – timrau 2014-10-27 15:27:37

+0

@timrau 問題是Thread只有這樣的代碼: ' printf(「Thread%d stop \ n」,* param); pthread_exit(0); ' 所以,沒有什麼可調試的...... – AndreaVan 2014-10-27 15:29:56

+1

你能提供剩下的代碼嗎?在pthread_exit被調用後,你如何知道內存正在增加?它不能與主線程相關嗎? – fhsilva 2014-10-27 15:42:53

回答

0

有一個KNO WN問題與可連接或分離線程,從手動引用:

只有當 終止合併線程已經加入是最後的 資源釋放回系統。當一個分離的線程終止 ,其資源被自動釋放回 系統

可以使螺紋可拆卸的:

pthread_attr_setdetachstate(3) 
+1

謝謝,但我使用這個: 'pthread_attr_setdetachstate(&attr_test,PTHREAD_CREATE_DETACHED);' 不正確? – AndreaVan 2014-10-27 16:20:03

+1

使用像'3'這樣的魔術數字並不是一個好主意。 – alk 2014-10-27 16:57:01

+0

:D也有幻數...它不起作用... – AndreaVan 2014-10-28 09:50:14

0

有一些問題,你的測試。 起初,pthread_attr_setstacksize具有以下文檔:

堆棧大小屬性確定最小尺寸(以字節爲單位),將線程被分配使用該線程創建屬性對象ATTR。

所以每個線程可以使用超過你設置的。但更重要的是,線程可以從操作系統分配內存來用作堆棧。這也適用於主線程。

因此,我不認爲有一種方法可以通過查看頂部命令的結果來實現您想要的結果,因爲此信息僅在線程本身內可見。

另請注意,進程使用的虛擬內存與進程使用的RAM數量無關。

Here是你可以嘗試檢查一個線程的總堆棧。

相關問題