首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libuv -如何保持默认循环运行,直到程序中的至少一个线程是活的?

libuv -如何保持默认循环运行,直到程序中的至少一个线程是活的?
EN

Stack Overflow用户
提问于 2014-03-12 20:26:43
回答 1查看 2K关注 0票数 3

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

主要功能的重要组成部分:

代码语言:javascript
复制
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;
}

主要功能:

代码语言:javascript
复制
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_default_loop()中注册uv_async_t,所以如果至少有一个活动线程,循环仍然是活动的。当线程应该退出时,它可能只是在主循环中注册的那个uv_close uv_async_t

EN

回答 1

Stack Overflow用户

发布于 2014-06-23 05:06:27

我没有测试,但我们能试试吗?

uv_run放入这样的无限循环中。

代码语言:javascript
复制
while(someflag)
{
    uv_run( uv_default_loop );
}

把这个循环放到一个线程里。如果没有在uv_loop中注册的事件,它将调用uv_run直到someflag == false。因此,您可以使用uv_async_send或其他方式异步结束此循环。

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22363036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档