Я реализовал крошечный веб-сервер в отдельном потоке, используя красивую библиотеку libevent. Веб-сервер запускает event_base_dispatch() для обработки всех событий. Мне нужен способ вырвать этот цикл отправки из основного потока.Как разбить цикл отправки libevent
Она сводится к следующему C++ код:
#include <stdlib.h>
#include <signal.h>
#include <thread>
#include <evhttp.h>
struct event_base *eb;
std::thread t;
static volatile sig_atomic_t bailout = false;
void my_signal_handler(int) {
bailout = true;
}
void onRequest(evhttp_request *req, void *) {
struct evbuffer *OutBuf = evhttp_request_get_output_buffer(req);
evbuffer_add_printf(OutBuf, "<html><body>Testing 1-2-3</body></html>");
evhttp_send_reply(req, HTTP_OK, "OK", OutBuf);
}
void dispatch() {
eb = event_base_new();
struct evhttp *http = evhttp_new(eb);
evhttp_set_gencb(http, &onRequest, NULL);
evhttp_bind_socket_with_handle(http, "0.0.0.0", 5555);
event_base_dispatch(eb);
}
int main() {
struct sigaction sigIntHandler;
sigIntHandler.sa_handler = my_signal_handler;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
sigaction(SIGINT, &sigIntHandler, NULL);
t = std::thread { &dispatch };
while (! bailout) {
std::this_thread::sleep_for(std::chrono::seconds(1));
}
event_base_loopexit(eb, NULL);
t.join();
}
поведение является то, что если вы запустите программу, запросить страницу, прервать программу по Ctrl-C, то event_base_dispatch() не продолжает работать до вы получаете другую веб-страницу. Только тогда цикл прерывается, и программа завершается.