Как сохранить цикл по умолчанию, пока хотя бы один поток в программе жив?

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Зарегистрирована в основном цикле.

3

Решение

Я не тестировал, но можем ли мы попробовать этот способ?

Положил uv_run в бесконечный цикл, как это.

while(someflag)
{
uv_run( uv_default_loop );
}

И поместите эту петлю в поток.
Если в uv_loop не зарегистрировано ни одного события, оно вызовет uv_run до тех пор someflag == false, Так что вы можете использовать uv_async_send или другие способы завершить этот цикл асинхронно.

-2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]