2017-12-03 125 views
0

我期望獲得100,000個請求,其中至少有100個請求是併發的。每當我收到請求時,我都會創建一個新線程,並在使用pthread_exit()完成後將其銷燬。使用pthread_detach我獲得99%的成功率。有沒有比這更好的方法?如何在C中同時處理100,000個請求

pthread_t hilo; 
// infinite loop 
while ((client_sock = accept(server_sock, (struct sockaddr *) &client_sockaddr, &len))) { 
    struct ClientSocket socks; 
    // some code... 
    pthread_create(&hilo, NULL, func, &socks); 
    pthread_detach(hilo); 
    printf("\nSocket is listening for the next request...\n"); 
} 

聽說pthread_join將利用資源沒有達到線程限制一個更好的辦法,但我這樣做的方式是不是併發。

pthread_t hilo;  
// infinite loop 
while ((client_sock = accept(server_sock, (struct sockaddr *) &client_sockaddr, &len))) { 
    struct ClientSocket socks; 
    // some code... 
    pthread_create(&hilo, NULL, func, &socks); 
    pthread_join(hilo, NULL); // it stops the main thread 
    printf("\nSocket is listening for the next request...\n"); 
} 

任何想法,將不勝感激!

+0

這是一篇很好的文章:http://www.kegel.com/c10k.html –

+3

創建和銷燬線程是一項非常繁重的操作。你有沒有考慮過使用線程池? –

+1

'我聽說pthread_join會是一種更好的方式......'不,幾乎從來沒有pthread_join做任何事情的更好方式:( –

回答

2

每次我得到的請求,我創建一個新的線程,並摧毀它,一旦它完成

別:它一個聰明的做法,因爲線程的創建是一個重量較輕的操作。

我聽說pthread_join會是一種更好的方式來利用資源而不會達到線程限制,但我做這件事的方式並不是一致的。

正確。無論何時你看到有人在做pthread_create之後立即跟着pthread_join,你都可以知道他們不知道他們在做什麼。只需簡單地直接撥打func即可實現完全相同的結果(效率更高)。

任何想法,將不勝感激!

您需要一個生產者 - 消費者隊列。監聽線程將accept連接並將它們排入一個(大小受限)線程池中的其他線程。其他線程將出列一項工作,並對該項目執行func。然後回到下一個項目,等等。

這裏是example生產者/消費者實施。但是你可以通過「生產者消費者隊列」搜索找到許多其他人。