2014-03-12 31 views
3

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_tuv_default_loop(),所以如果至少有一個活動線程,循環將仍然存在。當線程退出時,它可能只是uv_closeuv_async_t,在主循環中註冊。

回答

-2

我沒有測試,但我們可以試試這種方式嗎?

uv_run置入這樣的無限循環。

while(someflag) 
{ 
    uv_run(uv_default_loop); 
} 

並把這個循環放入一個線程。 如果在uv_loop中沒有註冊事件,它將調用uv_run,直到someflag == false。因此,您可以使用uv_async_send或其他方式異步結束此循環。

相關問題