繁体   English   中英

使用工作线程模式时如何正确处理信号?

[英]How to properly handle signals when using the worker thread pattern?

我有一个简单的服务器,看起来像这样:

void *run_thread(void *arg) {
    // Communicate via a blocking socket
}

int main() {
    // Initialization happens here...

    // Main event loop
    while (1) {
        new_client = accept(socket, ...);
        pthread_create(&thread, NULL, &run_thread, *thread_data*);
        pthread_detach(thread);
    }

    // Do cleanup stuff:
    close(socket);
    // Wait for existing threads to finish
    exit(0); 
)

因此,当收到SIGINT或SIGTERM时,我需要打破主事件循环以获得清理代码。 此外,主线程很可能正在等待accept()调用,因此它无法检查其他变量以查看它是否应该中断;

我发现的大多数建议都是这样的: http//devcry.blogspot.com/2009/05/pthreads-and-unix-signals.html (创建一个特殊的信号处理线程来捕获所有信号并做处理那些)。 然而,这是我无法真正解决的处理部分:我怎么可能告诉主线程从accept()调用返回并检查外部变量以查看它是否应该中断;?

通常我在等待select(listeninig-socket-here)而不是在accept() accept()通常是一种程序不会花费大量时间等待的方法。 当我在select()等待并且信号SIGTERM被发送到该线程时(在你的情况下它是主线程)我退出该selectselect返回interrupted system call

我认为你应该使用select call而不是accept来第二次skwllsp 但是,我的另一个建议是,你遵循博客的建议,你已发布的链接,并创建一个单独的信号处理线程,并忽略所有其他线程中的信号。 然后,当在信号处理线程中接收到信号时,使用pthread_cancel取消其他线程。 当你使用pthread_cancel时,如果被取消的线程处于取消点(select恰好是一个),它将会出来并进入你的处理程序,你可以清理并退出该线程。

你可以在这里这里这里找到更多相关信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM