我正在使用pthread在C中開發客戶端/服務器。在收到SIGINT或SIGTERM後關閉服務器之前線程的等待終止工作(C中Posix線程)
這是一款紙牌遊戲,其中server
是兩個clients
之間的玩家。
我這種情況
server.c:使用用於監聽最終進入上accept
連接線程調度
int main (int argc, char * argv[])
:
主
pthread_create(&sig_thread, NULL, &thread_signal_handler, &server_Socket);
線程捕捉內部主函數創建信號(方便maskered)
pthread_create(&tid[i++], NULL, &worker, (void*) arr_args)
每個客戶端相關聯,以創建線程(TID是陣列線程 ID)
pthread_join(sig_thread, NULL)
加入線程信號
pthread_join(tid[i], NULL)
加入用於連接每個客戶端創建的線程。
工人:
void * worker(void * args)
做他的工作,並終止
線程信號處理程序:
void * thread_signal_handler(void * arg)
無效* thread_signal_handler(無效* ARG){
sigset_t set; int sig, n; int * socket = (int*) arg; sigemptyset(&set); sigaddset(&set, SIGINT); sigaddset(&set,SIGTERM); while (server_UP) { /* wait for a signal */ if (sigwait(&set, &sig)) perror("Sigwait"); /* received SIGINT or SIGTERM - closing server */ if ((sig == SIGINT || sig == SIGTERM)) { printf(TERM_SERVER"\n"); server_UP = 0; /* global variable */ /* close socket blocked on MAIN */ shutdown(*socket, SHUT_RDWR); } return (void *) EXIT_SUCCESS;
}
以這種方式,信號被釣到阱和所述服務器是立即終止。 我需要,如果有匹配進行中,等待所有的工作人員完成他們的工作正常,所以我想知道如何說線程處理程序「你收到一個SIGINT(或SIGTERM)?好吧,等待終止所有工作人員「。
有什麼建議嗎?如果你需要更多的代碼,我會編輯這篇文章。
在所有線程上調用'pthread_join()'? – alk