【问题标题】:How to close all the threads before main thread by interrupting ctrl+c?如何通过中断ctrl+c关闭主线程之前的所有线程?
【发布时间】:2017-11-08 09:24:15
【问题描述】:

我在 C 中使用 _beginthread() 创建了 5 个线程池。池中的所有线程将无限运行以完成从客户端接收的作业。例如,当客户端连接时,池中的空闲线程将处理此问题。完成其任务后,线程将等待下一个客户端。现在我的问题是,每当我从服务器输入ctrl+c 时,程序就会终止。但我想在终止主线程之前关闭池中所有正在运行和等待的线程。

【问题讨论】:

  • C 还是 C++?请选择一种语言。
  • 如果您使用 C 编程,请不要添加 C++ 标签。虽然这门语言有共同的祖先并且语法相似,但它们仍然是非常不同的语言。
  • 至于你的问题,是关于如何捕捉CTRL-C,如何很好地告诉线程结束,或者两者结合的问题(在这种情况下你应该发布两个问题)?如果您还没有完成(奇怪,因为您已经成为会员三年多了),那么请花一些时间来read about how to ask good questions
  • 对于这个问题的第一部分,see this question
  • 无限运行是什么意思?你有没有使用 while(1) 这样做?或者任何其他控制线程的 API 中的客户端任务句柄?你能分享线程伪代码吗?有 3 种可能的解决方案,1. 您可以在 while(1) 中观察全局变量以触发线程清理,2. 在线程中调用任何阻塞 API 之前,您可以设置线程取消点并可以从信号处理程序发送取消。或 3. 你可以有线程的信号处理程序(不知道窗口,对于 linux refer

标签: c multithreading winapi


【解决方案1】:

对于 Windows

#include <windows.h> 
#include <stdio.h> 

BOOL WINAPI signal_handler(DWORD signal) {

    if (signal == CTRL_C_EVENT){
        printf("CTRL C caught here .\n");
    }
    return TRUE;
}

main()
{
    ....
    SetConsoleCtrlHandler(signal_handler, TRUE);

   .....

     printf("This should appear after signal_handler\n");
}

对于 linux

#include<stdio.h>
#include<signal.h>    

void signal_handler() 
{
    printf("CTRL C caught here .\n");
}

main() 
{

    ...
    // SIGINT is signal name create  when Ctrl+c will pressed 
    signal(SIGINT,signal_handler);  



    printf("This should appear after signal_handler\n");

}

一旦 ctrl-c 被捕获,你就可以关闭所有线程和其他清理工作

【讨论】:

  • 值得注意的是,在 Windows 中,signal_handler 在单独的线程中运行(并且主线程继续并行运行),而在 Linux 中,主线程被中断以运行 @987654324 @.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
  • 1970-01-01
相关资源
最近更新 更多