libuv 作为 node 的底层库,在错误处理方面只是简单的 abort(),很野蛮,显然这是为单进程的 node 服务的。
双11临近了,作为windows 上的 daemon 服务程序,需要定时运行一些任务。包装了 libuv 的 luv 刚好满足这个需求,lua 方便的改变业务逻辑,并且依靠 libuv 的定时器和文件监视模块做定时逻辑。不过 libuv 的错误处理太过野蛮,用这个模块导致程序崩溃退出就得不偿失。下面给出错误处理例子,然后在线程中初始化 luv 环境。
#include <csetjmp>
#include <csignal>
#include <cstdlib>
#include <iostream>
#include <Windows.h>
#include <process.h>
jmp_buf env;
void on_sigabrt(int signum)
{
longjmp(env, 1);
}
void try_and_catch_abort(void (*func)(void))
{
if (setjmp(env) == 0) {
signal(SIGABRT, &on_sigabrt);
(*func)();
} else {
std::cout << "aborted\n";
}
}
void do_stuff()
{
std::cout << "step 1\n";
std::cout << "step 2\n";
}
void do_stuff_aborted()
{
std::cout << "step 1\n";
abort();
std::cout << "step 2\n";
}
extern "C" UINT __stdcall run_lua_in_thread(LPVOID lParam)
{
try_and_catch_abort(&do_stuff_aborted);
try_and_catch_abort(&do_stuff);
return 0;
}
int main()
{
HANDLE hThread;
hThread = (HANDLE)_beginthreadex(NULL, 1024 * 1024 * 2, run_lua_in_thread, NULL, 0, NULL);
if (hThread) {
SetThreadPriority(hThread, THREAD_PRIORITY_NORMAL);
CloseHandle(hThread);
hThread = NULL;
}
system("pause");
return 0;
}