0
 main() {
    unsigned int newfd;
    ...
    .....
    while (1) {        
      printf("Waiting for connection\n");
      addrlen = sizeof (clientaddr);
      if ((newfd = accept(listener, (struct sockaddr *) &clientaddr, &addrlen)) < 0) {
          perror("Server-accept() error lol!");
          break;
      }
      printf("New connection from %s on socket %u\n", inet_ntoa(clientaddr.sin_addr), newfd);
      pthread_create(&threads[i++], NULL, (void*)fileTransfer_Worker, &newfd); 
      sleep(1);
   }

}

void* fileTransfer_Worker(void *desc) {
     unsigned int sock = *(unsigned int *) desc;
     printf("Waiting for data in sock %d %u\n", sock, pthread_self());
}

出力

Waiting for connection
New connection from 192.168.4.57 on socket 4
Waiting for connection
New connection from 192.168.4.57 on socket 5
Waiting for connection
Waiting for data in sock 4 3076578160
Waiting for data in sock 5 3068189552
New connection from 192.168.4.57 on socket 6
Waiting for connection
Waiting for data in sock 6 3059800944
New connection from 192.168.4.57 on socket 7
Waiting for connection
New connection from 192.168.4.57 on socket 8
Waiting for connection
New connection from 192.168.4.57 on socket 9
Waiting for connection
Waiting for data in sock 8 3051412336
New connection from 192.168.4.57 on socket 10
Waiting for data in sock 9 3034635120
Waiting for data in sock 10 3043023728
Waiting for connection
New connection from 192.168.4.57 on socket 11
Waiting for connection
New connection from 192.168.4.57 on socket 12
Waiting for connection
New connection from 192.168.4.57 on socket 13
Waiting for connection
Waiting for data in sock 13 3001080688
Waiting for data in sock 13 3026246512
Waiting for data in sock 13 3017857904
Waiting for data in sock 13 3009469296

出力を調べると、ソケット 13 が 4 回表示されていることがわかります。これは、実際にはソケット 7、11、12、および 13 に対するものです。

より多くのクライアント接続を同時に呼び出すたびに、動作が変わります。

pthread_create() の後に sleep(1) を追加すると、予想される動作を確認できました。pthread_create 後のスリープは必須ですか? または、スリープを使用せずにこの問題を解決するにはどうすればよいですか?

これについて私を助けてください。前もって感謝します

4

1 に答える 1

2
pthread_create(&threads[i++], NULL, (void*)fileTransfer_Worker, &newfd);
                                                                ^^^^^^

問題は、ローカル変数のアドレスを に渡していることですpthread_create。スレッドが使用を開始するまでに、mainすでに変更されている可能性があります。そのため、記述子が10を呼び出しpthread_createたときである場合、スレッドが実際に使用を開始したときに、mainすでにそれを変更する可能性がありました。

これを修正するには、少なくとも 2 つのオプションがあります。

  • スレッドごとに個別のオブジェクトを渡します (おそらく、あなたが作成したものmalloc)
  • のように引数に整数を詰め込み、スレッド関数でvoid *キャストバックしますint

2 番目のオプションは広く使用されていますが、移植性もありません。

于 2012-08-20T08:03:46.150 に答える