server
后, start
将在新线程中启动(服务器具有自己的循环)。
问题是程序立即结束,因为在默认循环中没有注册事件。我想要的是通过pthread_join
模拟uv_default_loop
。
我想避免在所有对象上调用一些自定义join
方法,这些对象应该在分离的线程中运行,以保持主线程的活动。
主要功能的重要部分:
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
解决方案是每个新线程都应在uv_async_t
中注册uv_default_loop()
,因此如果至少有一个活动线程,则循环仍然有效。当线程退出时,它可能只是uv_close
uv_async_t
,在主循环中注册。
答案 0 :(得分:-2)
我没有测试,但我们可以尝试这种方式吗?
将uv_run
放入这样的无限循环中。
while(someflag)
{
uv_run( uv_default_loop );
}
将此循环放入线程中。
如果在uv_loop中未注册任何活动,则会在uv_run
之前致电someflag == false
。因此,您可以使用uv_async_send
或其他方式异步结束此循环。