正确终止multithreadingWindows控制台应用程序

下面是我正在从一个更大的项目中投入的一个概念certificate。 该项目具有使用CreateThread创build的工作线程,该线程监视目录中的更改。 我有一些清理代码需要像closures句柄一样运行并释放一些内存。

该应用程序不作为后台进程或服务运行。 它通过命令行运行并运行,直到用户closures命令窗口或按下Ctrl-C

有一个更好的方法吗? 我试过使用atexit但是当进程被杀死的时候显然没有被调用。

请注意,我正在使用C,而不是C ++,并且不使用MFC,AFX或Windows API以外的任何其他API。 基于评论,我想另外一部分是如何正确地终止在multithreading环境中的应用程序? 这是好的,还是应该在thread_func调用ExitProcess

更新:我已经更新了卢克的下面的评论,以设置一个标志,指示该应用程序正在终止。 我也改变它使用atexit来调用清理函数,而不是直接调用它。

 #include <stdio.h> #include <windows.h> HANDLE thread_handle = INVALID_HANDLE_VALUE; BOOL time_to_quit = FALSE; DWORD WINAPI thread_func(LPVOID lpvd) { fwprintf(stdout, L"thread running...\n"); while (!time_to_quit) { /* do stuff */ Sleep(10); } return 0; } void cleanup() { /* clean up code here that needs to be run at exit */ fwprintf(stdout, L"cleaning up...\n"); CloseHandle(thread_handle); } BOOL WINAPI console_handler(DWORD event) { time_to_quit = TRUE; return FALSE; } int wmain(int argc, wchar_t* argv[]) { DWORD thread_id = 0; thread_handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread_func, NULL, 0, &thread_id); if (thread_handle != NULL) { atexit(cleanup); fwprintf(stdout, L"thread created...\n"); SetConsoleCtrlHandler((PHANDLER_ROUTINE)console_handler, TRUE); WaitForSingleObject(thread_handle, INFINITE); } return 0; } 

一般来说,你可以使用signal()

 #include <stdio.h> #include <stdlib.h> /* exit() */ #include <signal.h> /* signal() */ #include <unistd.h> /* sleep() */ void my_sigtrap(int sig) { printf ("\n" "Signal %d == %d received.\n" "Bye bye\n", sig, SIGINT); exit(0); } int main(void) { void (*orig_sig_fun)(int); orig_sig_fun = signal(SIGINT, my_sigtrap); if (orig_sig_fun == SIG_IGN) { printf("Ignored by default\n"); signal(SIGINT, SIG_IGN); } else if (orig_sig_fun == SIG_DFL) { printf("Signal handled by default.\n"); } else if (orig_sig_fun == SIG_ERR) { perror("Failed to set signal\nNo trap\n --"); } setbuf(stdout, NULL); /* Turning off buffering */ putchar('.'); while (1) { putchar('.'); sleep(1); } return 0; }