Libuv - как остановить tcp-сервер, который работает в другом потоке
Например, у меня есть 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
до того, как цикл перейдет в режим блокировки, чтобы ждать новых событий).
Если вы запустите uv_run с UV_RUN_DEFAULT, это будет блокирующий вызов. Однако, если вы используете uv_stop, тогда uv_run немедленно вернется. Помните, что единственной функцией в uv, которая является потокобезопасной, является uv_async_send, поэтому, если вы хотите вызвать uv_stop в своем цикле TcpServer, вам придется делать это из цикла.