3

server调用后将在新线程中启动start(服务器有自己的循环)。问题是程序立即结束,因为默认循环上没有注册事件。我想要的是pthread_join通过uv_default_loop. 我想避免join在所有对象上调用一些自定义方法,这些对象应该在单独的线程中运行,以保持主线程处于活动状态。

main函数的重要部分:

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_tuv_default_loop()所以如果至少有一个活动线程。uv_close当线程应该退出时,它可能只是uv_async_t在主循环中注册。

4

1 回答 1

-3

我没有测试,但是我们可以尝试这种方式吗?

uv_run这样陷入无限循环。

while(someflag)
{
    uv_run( uv_default_loop );
}

并将这个循环放入一个线程中。如果 uv_loop 中没有注册事件,它将调用uv_rununtil someflag == false。所以你可以使用uv_async_send或其他方式来异步结束这个循环。

于 2014-06-23T05:06:27.130 回答