クライアントがサーバーに接続するたびに切り離されたスレッドを作成するサーバーがあり、そのコードの要点は次のとおりです。
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
スレッド スタックがまだプロセスに関連付けられているのはなぜですか?
これを解決するためのあなたの助けに感謝します。