2013-07-23 30 views
2

我已經編寫了一個實現套接字連接的C/C++代碼,並且主線程在連續循環中監聽其端口。當這個端口發出連接請求時,我使用pthread調用產生了一個線程,並卸載了該線程上的工作。因此,我'n'線程動態創建'n'傳入請求。 問題是,如果一個線程終止,主線程也終止。如何在c/C++中動態創建線程

我已經使用了pthread_join(),但它等待參數中的線程完成。在我的情況下,一旦調用pthread_join(),新線程就不會產生。

pthread_t t; 
while(1) //server always to be in listen mode 
{ 
    client_len=sizeof(client_sockaddr); 
    client_sockfd=accept(server_sockfd,(struct sockaddr*)&client_sockaddr,&client_len); 


    pthread_create(&t,NULL,server_thread,(void*)client_sockfd); 

    (void)pthread_join(t,NULL); 

    } 
+1

你可以發佈一個完整的例子,顯示主線程退出時,一個子線程退出嗎? – simonc

+0

分離pthread,以便完成時返回到系統。 – CBIII

+0

如果你正在嘗試創建多個線程,那麼你將需要一個pthread_t數組,而不僅僅是1。 –

回答

3

如果你不關心從線程返回值,你不感興趣,當他們完成,那麼你應該pthread_detach分開它們,或者在開始用一種超然的狀態創建它們:

pthread_attr_t thread_attr; 
pthread_attr_init(&thread_attr); 
pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED); 
while(1) //server always to be in listen mode 
{ 
    client_len=sizeof(client_sockaddr); 
    client_sockfd=accept(server_sockfd,(struct sockaddr*)&client_sockaddr,&client_len); 

    pthread_t t; 
    pthread_create(&t,&thread_attr,server_thread,(void*)client_sockfd); 
} 
pthread_attr_destroy(&thread_attr); 
+0

@simonc我對Berkeley套接字的任何實現都不熟悉,其中套接字句柄不是整數。由於該整數正在通過值傳遞給線程函數 - 儘管通過類型轉換爲void *形式 - 不需要擔心覆蓋。有可能'void *'不能存儲所有可能的'int'值,但是這樣的實現是很少見的,並且在任何情況下,這些操作都出現在OP代碼中 - 我沒有介紹它。 – Casey

+0

對不起,你說的沒錯。我錯讀了,並且認爲局部變量的地址被傳遞,而不是被處理爲'void *'的句柄。 – simonc

0

在代碼中添加printf("check string\n");pthread_join。現在編譯並運行它。你可能會對你的問題有所瞭解。

您不會遇到printf函數。

行爲的原因是pthread_join將等待第一個創建的線程完成工作。

所以除非和直到第一個線程完成作業新線程不會創建。所以你的代碼不會接受任何新的客戶端連接。

所以不要在你的while(1)裏面使用pthred_join那麼你的問題就解決了。

當主進程想要等到線程完成作業時,pthread_join纔是最有用的。