server
將在start
被調用後(服務器具有自己的循環)在新線程中啓動。 問題是程序立即結束,因爲在默認循環中沒有事件註冊。我想要的是通過uv_default_loop
模擬pthread_join
。 我想避免在所有對象上調用一些自定義的join
方法,這些對象應該在分離的線程中運行,以保持主線程活着。libuv - 如何保持默認循環運行,直到程序中至少有一個線程處於活動狀態?
重要組成部分:
int main(int argc, const char * argv[])
{
...
TcpServer server("127.0.0.1", 7777);
server.start();
uv_run(uv_default_loop(), UV_RUN_DEFAULT);
uv_loop_close(uv_default_loop());
return 0;
}
主要功能:
int main(int argc, const char * argv[])
{
/* initialize openssl random generator */
const char * seed = "asfanfasfflalkhflhafoih";
RAND_seed(seed, (size_t)strlen(seed));
uv_tty_t tty;
uv_tty_init(uv_default_loop(), &tty, 0, 1);
uv_tty_set_mode(&tty, 0);
uv_read_start((uv_stream_t *)&tty, allocateBuffer_cb, tty_read_cb);
// unref tty, it shouldn't keep the loop alive
uv_unref((uv_handle_t *)&tty);
uv_signal_t sigterm;
uv_signal_init(uv_default_loop(), &sigterm);
uv_signal_start(&sigterm, signal_handler, SIGTERM);
uv_signal_t sigint;
uv_signal_init(uv_default_loop(), &sigint);
uv_signal_start(&sigint, signal_handler, SIGINT);
// unref signal handlers, they shoudn't keep the loop alive
uv_unref((uv_handle_t *)&sigterm);
uv_unref((uv_handle_t *)&sigint);
TcpServer server("127.0.0.1", 7777, uv_default_loop());
server.start();
uv_run(uv_default_loop(), UV_RUN_DEFAULT);
uv_loop_close(uv_default_loop());
// we should reset tty before end
uv_tty_reset_mode();
return 0;
}
解決:我發現這個話題,這是非常好的
https://groups.google.com/forum/#!topic/nodejs/Sob97-QbtlA 解決方案是每一個新的線程守ld寄存器uv_async_t
的uv_default_loop()
,所以如果至少有一個活動線程,循環將仍然存在。當線程退出時,它可能只是uv_close
即uv_async_t
,在主循環中註冊。