2012-12-28 64 views
0

我正在使用gcc在linux上編寫一個程序。 如果我不使用睡眠聲明 它會隨機打印「線程創建」2,3或4次。任何人都可以解釋我這種行爲? //下面的代碼只是一個樣品,我知道是不是創建一個線程真正有用的只是打印字符串:)C linux pthread需要睡眠才能工作

void* makeRequest(void* arg) { 
    printf("Thread created\n"); 
} 

int main(){ 
    pthread_t thr[10]; 
    for(i=0; i<3; i++){ 
     pthread_create(&thr[i], 0, makeRequest, &i); 
     sleep(1); 
    } 
} 

附:我包括pthread.h和編譯選項-pthread

回答

2

除了其他言論,

pthread_create(&thr[i], 0, makeRequest, &i); 

是不正確的,因爲i是一個局部變量,所以&i是相同的指針在您撥打的所有電話pthread_create

您通常應該使數據指針指向您的線程例程 - 這裏的線程例程是makeRequest靜態指針或唯一指針(每個線程都是唯一的);在實踐中,使其成爲一些指向一些記憶的指針。

一個更好的做法是聲明一些struct my_thread_data_st,與

struct my_thread_data_st* td = malloc(sizeof(struct my_thread_data_st)); 
if (!td) perror("malloc td"), exit(EXIT_FAILURE); 
memset (td, 0, sizeof(struct my_thread_data_st)); 
// fill td appropriately, then 
pthread_create(&thr[i], 0, makeRequest, td); 

唯一分配它在堆或者你可以有例如數組int-s,例如int num[4];,適當地初始化它,然後pthread_create(&thr[i], 0, makeRequest, &num[i]);

當然,如果td是堆分配通malloc,在適當的時間,例如不要忘記free它在線程結束之後(例如在擁有pthread_join之後)。您可能也會對Boehm's GC感興趣,並使用GC_malloc而不是malloc(然後,不要擔心釋放內存,GC會這樣做)。

如果線程訪問共享數據,您(使用pthread_mutex_lock & pthread_mutex_unlock)應連續訪問它與一些[全局或靜態]互斥

不要忘記在退出之前調用pthread_join在所有線程-例如從main返回。

我建議你閱讀一下pthreads tutorial和一些關於advanced linux programming的書。

+0

非常感謝您的非常詳細的答案,它幫助我進行了很多堆內存分配。 – NiCU

4

您應該加入您創建的所有線程,結束main,因爲您退出整個過程。

或者,您可以用pthread_exit結束您的main

+0

因此pthread連接必須在聲明之後完成? (我的程序非常複雜,並且「for」語句必須無限次執行,因爲它等待客戶端請求;當客戶端請求存在時它將創建3個線程)while(1){for(i = 0; i < 3; i ++){ pthread_create(&thr [i],0,makeRequest,&i); sleep(1); }}' – NiCU

+2

您必須確保'main'不會在任何其他線程之前結束。所以,是的,連接必須在創建'for'循環中的線程和'main'終止之間。 –

1

您需要:

for(i = 0; i < 3; i++) 
{ 
    pthread_join(thr[i], NULL); 
} 

當你寫它,沒有什麼等待你的線程主返回之前完成,並退出的全過程,殺死線程。

1

首次使用加入:,如果您不使用它,則不需要發送&i

隨機打印「線程創建」2,3或4次。

當主線程死了所有子線程也死。所以你需要等待加入。

隨機。:因爲我們不知道在線程切換哪個地方會有機會。它可能是主線程或子線程。

for(i=0; i<3; i++){ 
     pthread_create(&thr[i], 0, makeRequest, &i); 
} 

for(i=0; i<3; i++){ 
     pthread_join(thr[i], NULL); 
} 

使用-lpthread -pthread

$ gcc file.c -lpthread -o output  

EDITED

-pthread增加了對與 「並行線程」 庫支持多線程。此選項設置標誌的預處理器和連接兩個:Jens Gustedt comment

Difference between -pthread and -lpthread

+0

感謝-lpthread建議,我會詳細瞭解這個 //我知道我不會不需要發送那個「我」,但正如我之前所說,這只是一個示例,(整個代碼大約有500行) – NiCU

+0

@nickNatra:那很好...... –

+0

@nickNatra但我不認爲'「線程創建「 '打印4次,可能最多3次。 –