2017-12-03 10 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接続になり、(サイズが制限された)スレッドプール内の他のスレッドにエンキューされます。他のスレッドは1つの作業項目をデキューし、その項目に対してfuncを実行します。その後、次の項目に戻るなど。

ここにはexampleプロデューサ/コンシューマの実装があります。しかし、 "プロデューサーのコンシューマーキュー"検索で多くのものを見つけることができます。

関連する問題