2017-12-07 4 views
0

私はC++で書かれたチャットサーバーを持っていますが、私はphtreadsに問題があります。 このサーバーは複数の接続を処理すると仮定しているので、pthreadの配列を作成しました。新しいクライアントが接続すると、配列からこのクライアントに1つのpthreadが渡され、そこで関数の実装が呼び出されます。しかし、このクライアントがdisconectときどのpthreadが終了し、pthread配列にどのインデックスが空であるか見つける方法を知らない。私はこのコードが恐ろしいことを知っていますが、私は本当にこのプログラムをより良くしたいです実行中のpthreadの配列から終了したpthreadに参加するには

そしてそれ以上に100人が接続すれば、私は配列をreallocするでしょう?

どのpthreadがそのpthreadへの参加で終了したか、そしてどのインデックスを今再び使用することができるかを見つけるにはどうすればよいですか?

struct parsing{ 
    int socket; 
}; 

int i = 0; 
int strop = 100; 
pthread_t *thread; 
thread = (pthread_t*)malloc(sizeof(pthread_t)*100); 
struct parsing args; 
while (1) 
{ 
    if((client_sock = accept(socket_desc, (struct sockaddr *)&socket_addr, (socklen_t *)&client_sock_len)) < 0) 
    { 
     fprintf(stderr,"Accept Error"); 
     return 5; 
    } 
    printf("connected %d",client_sock); 
    args.socket = client_sock; 
    pthread_create(&thread[i], NULL, &handle_connection, (void *)&args); 
    i++; 
    if (i == strop) 
    { 
     strop = strop + 100; 
     void * ptr = (pthread_t*)realloc(thread,sizeof(pthread_t)*strop); 
    } 
} 
+0

std :: threadを使用します。 –

答えて

0

どのように私はそれのpthreadに参加するために、インデックスが今再び使用して自由である発見のために終了のpthreadた見つけるのですか?

pthreads APIは、終了したスレッドを検出する方法を提供しません。 Glibcにはポータブルではない拡張機能があり、特定のスレッド(ノンブロッキング・ジョイン)を試みることができます(pthread_tryjoin_np()を参照)。それが利用可能であれば、その周りにポーリング・ベースのソリューションを構築することができます。

しかし、私はこれを達成する権利方法を言うと思いますが、彼らが行われていることをメインスレッドを伝えるにワーカースレッドのためのメカニズムを確立することです。例えば、メインスレッドが見ることができるリンクされたリストに独自のスレッドIDを追加してから、信号を送信するか、またはpthread_cond_signal()を使用してメインスレッドの注意を得ることができます。共有変数へのマルチスレッドアクセスに適切な同期を提供するようにしてください。

+0

OKこれを試してみます:) – krakra

+0

args構造体をいくつかのpthreadに再利用すると、スレッド内ですぐにファイル記述子をコピーしても、ほぼ確実に問題が発生します。新しいスレッドがOSによってスケジュールされる前に、別のクライアントが接続することは常に可能です。 (ジョンが言ったように:適切な同期が重要です) – Ronald

関連する問題