1

クライアントがサーバーに接続するたびに切り離されたスレッドを作成するサーバーがあり、そのコードの要点は次のとおりです。

  tid_data.accept_skt     = accept_skt;
    tid_data.slot           = slot;
    snprintf(tid_data.client_info, sizeof(tid_data.client_info),
             "%s:%d\n", ipstr, port);
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

    if (pthread_create(&nextThread, &attr, credsChckrThread, (void*)&tid_data) != 0) {
       CSprintf("Error: pthread_create() failed - %s", strerror(errno));
       close(accept_skt);
       continue;
    }

" ここにスレッド関数があります (それが呼び出す関数を省略しています) "

static  void *credsChckrThread(void *data)
{
    tid_data_t tid_data;
    int     len, slot, accept_skt;
    char    *cptr, buffer[128];
    struct timeval tv;

    memcpy(&tid_data, data, sizeof(tid_data));
    accept_skt = tid_data.accept_skt;
    slot    = tid_data.slot;

    buffer[sizeof(buffer)-1] = '\0';
    while (1) {
       tv.tv_sec    = 120;
       tv.tv_usec   = 0;
       setsockopt(accept_skt, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv,sizeof(struct timeval));
       len = recv(accept_skt, buffer, sizeof(buffer)-1, 0);
       if (len == 0) {
          if (!errno) continue;
          // log
          break;
       }
       if (len < 0) {
          // log
          break;
       }
       // validate user - omitted
       // fill in cptr with OK or Denied -- omitted
       len = send(accept_skt, cptr, strlen(cptr)+1, 0);
       if (len <= 0) {
          // log
          break;
       }
    }
    close(accept_skt);
    pthread_exit(NULL);
    return NULL; // Thread exits
}

"

すべてのクライアント接続と切断の後、私は次のことを行い、スレッドのスタックが解放されていないことを発見しました:

[root@xxx tmp]# pmap 12108 | grep 10240 | wc -l 0 [ルート@xxx tmp]# pmap 12108 | grep 10240 | wc -l 1 [ルート@xxx tmp]# pmap 12108 | grep 10240 | トイレ -l 2

スレッド スタックがまだプロセスに関連付けられているのはなぜですか?

これを解決するためのあなたの助けに感謝します。

4

1 に答える 1