2014-02-07 61 views
2

我正在使用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)?好吧,等待终止所有工作人员“。

有什么建议吗?如果你需要更多的代码,我会编辑这篇文章。

+0

在所有线程上调用'pthread_join()'? – alk

回答

1

创建它们时,可以将所有线程保存在数组或列表中,最后在所有线程上调用pthread_join()。

while (pthread_list) { 
    pthread_join(pthread_list->th_id, NULL); 
    pthread_list = pthread_list->next; 
} 

如果您不想跟踪所有线程,你可以保持运行的线程的计数,调用在pthread_create之前增加了,减少计数为每个线程结束。

然后在处理程序中,您会反复睡眠几秒钟,直到计数变为0.

+0

如果你读这个'pthread_join(tid [i],NULL)'的签名,我正好这样做(我只是使用一个pthread_t数组来代替一个列表)。 'while(i--!= 0) { pthread_join(tid [i],NULL); }' 每当我创建一个线程,我把它放在'tid [i]' 够了吗? – Kyrol

+0

是的,够了。 pthread_join一直等到指定的线程结束,所以如果在退出循环时等待所有线程都完成了所有线程的完成。 – drolando

+0

我将在主循环中进行检查:如果server_UP == 0,它不应该接受任何新的连接。如果在“加入时”开始后启动线程,则可能会错过该线程。所以你也必须在server_UP = 0之后放一段时间; – drolando