Libuv - как остановить tcp-сервер, который работает в другом потоке

88
11

Например, у меня есть 2 потока. Я хочу остановить сервер из основного потока (Thread 1).


Тема 1: основная программа


Тема 2: TcpServer


Из библиотеки libuv:


/*
* This function will stop the event loop by forcing uv_run to end
* as soon as possible, but not sooner than the next loop iteration.
* If this function was called before blocking for i/o, the loop won't
* block for i/o on this iteration.
*/
UV_EXTERN void uv_stop(uv_loop_t*);

Это означает, что если бы я вызвал uv_stop(tcp_server_loop) в основном потоке, и цикл сервера будет заблокирован из-за отсутствия событий на tcpserver, тогда сервер будет оставаться в цикле до появления какого-либо события. (он, вероятно, проверяет, был ли вызов uv_stop до того, как цикл перейдет в режим блокировки, чтобы ждать новых событий).

спросил(а) 2014-03-11T18:23:00+04:00 6 лет, 4 месяца назад
1
Решение
88

Если вы запустите uv_run с UV_RUN_DEFAULT, это будет блокирующий вызов. Однако, если вы используете uv_stop, тогда uv_run немедленно вернется. Помните, что единственной функцией в uv, которая является потокобезопасной, является uv_async_send, поэтому, если вы хотите вызвать uv_stop в своем цикле TcpServer, вам придется делать это из цикла.

ответил(а) 2014-05-26T11:54:00+04:00 6 лет, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема