相信用C/C++写过服务的同学对通过响应Ctrl-C(信号量SIG_TERM)实现多线程C进程的优雅退出都不会陌生,典型的实现伪码如下:
#include <signal.h>
int main(int argc, char * argv[])
{
// 1. do some init work
... init() ...
// 2. install signal handler, take SIGINT as example install:
struct sigaction action;
memset(&action, 0, sizeof(struct sigaction));
action.sa_handler = term;
sigaction(SIGTERM, &action, NULL);
// 3. create thread(s)
pthread_create(xxx);
// 4. wait thread(s) to quit
pthread_join(thrd_id);
return 0;
}
主要步骤概括如下:
1)设置SIG_TERM信号量的处理函数
2)创建子线程
3)主线程通过pthread_join阻塞
4)主线程收到Ctrl-C对应的SIG_INT信号后,信号处理函数被调用,该函数通常会设置子线程的退出flag变量
5)子线程的spin-loop通常会检测flag变量,当flag指示退出时机已到时,子线程break其loop
6)待子线程释放资源退出后,主线程的pthread_join()结束阻塞返回,主线程退出,进程销毁
然而,如果用Python多线程库(threading或thread)实现一个与上述伪码流程相似的多线程模块时,新手很容易犯错,导致进程启动后,C