libuv 作為 node 的底層庫,在錯誤處理方面只是簡單的 abort(),很野蠻,顯然這是為單進(jìn)程的 node 服務(wù)的。
雙11臨近了,作為windows 上的 daemon 服務(wù)程序,需要定時運(yùn)行一些任務(wù)。包裝了 libuv 的 luv 剛好滿足這個需求,lua 方便的改變業(yè)務(wù)邏輯,并且依靠 libuv 的定時器和文件監(jiān)視模塊做定時邏輯。不過 libuv 的錯誤處理太過野蠻,用這個模塊導(dǎo)致程序崩潰退出就得不償失。下面給出錯誤處理例子,然后在線程中初始化 luv 環(huán)境。
#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;
}