2013-05-09 108 views
0

守則第一等待所有子線程來完成(在C)

while(running) 
{ 
    memset(&tcp_client, 0, tcp_client_len); 

    FD_ZERO(&readFDs); 
    FD_SET(tcp_server_s, &readFDs); 
    tv.tv_sec = 1; 
    if(select(0, &readFDs, NULL, NULL, &tv)) 
    { 
     if((tcp_client_s = accept(tcp_server_s, (struct sockaddr *)&tcp_client,&tcp_client_len)) == INVALID_SOCKET) 
     { 
      cli_log(PROTO_TCP, LOG_ERROR, "(%d) accept() failed\n", WSAGetLastError()); 
      continue; 
     } 
     cli_log(PROTO_TCP, LOG_COMM, "(%s:%d) accepted connection\n", inet_ntoa(tcp_client.sin_addr), ntohs(tcp_client.sin_port)); 

     CreateThread(NULL, 0, tcp_thread, (LPVOID)tcp_client_s, 0, NULL); 
    } 
} 

這是我的TCP線程處理程序的一部分。我想知道的是如何讓它等待他的所有子線程退出時不running了(CTRL + C信號)之前完成。

回答

3
  1. 保持的含有成功創建的線程句柄HANDLE秒的列表(一個HANDLECreateThread()如果成功結果)。
  2. 使用WaitForMultipleObjects()之前加入的每個線程的應用程序退出。
+0

如果我通過包含已經關閉線程'HANDLE'列表會發生什麼處理成'WaitForMultipleObjects的()'? – Ithilion 2013-05-09 14:11:52

+0

文檔狀態:_IF這些手柄之一,而等待仍懸而未決關閉時,函數的行爲是undefined._如果包含在進入功能關閉,目前尚不清楚。我會建議從列表中刪除它。 – hmjd 2013-05-09 14:14:34