2017-12-03 2 views
0

Ich erwarte 100.000 Anfragen mindestens 100 von ihnen würden gleichzeitig sein. Jedes Mal, wenn ich eine Anfrage erhalte, erstelle ich einen neuen Thread und zerstöre ihn, sobald er fertig ist, mit pthread_exit(). Mit pthread_detach bekomme ich 99% Erfolgsquote. Gibt es einen besseren Weg als das?So behandeln Sie 100.000 Anfragen gleichzeitig in C

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"); 
} 

Ich hörte pthread_join wäre ein besserer Weg, um Ressourcen zu nutzen, ohne den Faden Grenze erreicht, aber die Art, wie ich es tue, ist nicht gleichzeitig.

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"); 
} 

Irgendwelche Ideen würden geschätzt werden!

+0

Hier ist ein guter Artikel zu lesen: http://www.kegel.com/c10k.html –

+3

Erstellen und Löschen von Threads ist eine sehr schwere Operation. Haben Sie überlegt, Thread-Pools zu verwenden? –

+1

'Ich hörte pthread_join wäre ein besserer Weg ...' Nein, fast nie ist pthread_join eine bessere Art, etwas zu tun :( –

Antwort

2

Jedes Mal, wenn ich eine Anfrage bekommen, ist ich einen neuen Thread zu schaffen und zerstören, sobald es

getan Sie nicht: es ist nicht ein intelligentes, was zu tun ist, weil Thread-Erzeugung a Schwerlastbetrieb.

Ich hörte, pthread_join wäre eine bessere Möglichkeit, Ressourcen zu nutzen, ohne die Thread-Grenze zu erreichen, aber die Art, wie ich es mache, ist nicht gleichzeitig.

Korrekt. Wenn Sie jemanden sehen, der pthread_create sofort gefolgt von pthread_join tut, können Sie sagen, dass sie keine Ahnung haben, was sie tun. Das exakt gleiche Ergebnis könnte (viel effizienter) erreicht werden, indem einfach func direkt aufgerufen wird.

Irgendwelche Ideen würden geschätzt werden!

Sie benötigen eine Producer-Consumer-Warteschlange. Der Listening-Thread wird accept Verbindungen und Enqueues sie für andere Threads in einem (Größen-begrenzten) Thread-Pool. Die anderen Threads entfernen ein Arbeitselement und führen func für dieses Element aus. Dann gehe zurück zum nächsten Gegenstand und so weiter.

Hier ist eine example Hersteller/Verbraucher-Implementierung. Aber Sie können viele andere mit der "Producer Consumer Queue" Suche finden.

Verwandte Themen