gpt4 book ai didi

c - 在收到 SIGINT 或 SIGTERM(C 中的 Posix 线程)后关闭服务器之前等待线程终止

转载 作者:太空宇宙 更新时间:2023-11-03 23:50:15 25 4
gpt4 key购买 nike

我正在使用 pthread 在 C 中开发客户端/服务器。

这是一种纸牌游戏,服务器 是两个玩游戏的客户端 之间的庄家。

我有这种情况

server.c:

主要内容:

  • int main (int argc, char * argv[])

    用作线程调度程序以监听最终在 accept 上进入连接

  • pthread_create(&sig_thread, NULL, &thread_signal_handler, &server_Socket );

    捕获在 main 函数中创建的信号(方便地掩饰)的线程

  • pthread_create(&tid[i++], NULL, &worker, (void*) arr_args)

    每个客户端都关联到一个创建的线程(tid线程 ID 的数组)

  • pthread_join(sig_thread, NULL)

    为信号加入线程

  • pthread_join(tid[i], NULL)

    加入为每个连接的客户端创建的线程。

worker :

  • void * worker(void * args)

    做他的工作并终止

线程信号处理程序:

  • void * thread_signal_handler(void * arg)

void * thread_signal_handler(void * 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;

}

这样就很好的捕捉到了信号,立即终止了服务器。如果正在进行匹配,我需要等待所有 worker 正确完成他们的工作,所以我想知道如何对线程处理程序说“你收到 SIGINT(或 SIGTERM)了吗?好的,等待所有 worker 的解雇。”

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

最佳答案

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

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

如果您不想跟踪所有线程,您可以对正在运行的线程进行计数,在调用 pthread_create 之前递增它,在每个线程完成时递减计数。

然后在处理程序中,您将反复休眠几秒钟,直到计数变为 0。

关于c - 在收到 SIGINT 或 SIGTERM(C 中的 Posix 线程)后关闭服务器之前等待线程终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21625967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com