gpt4 book ai didi

c++ - 如何打破 libevent 的调度循环

转载 作者:行者123 更新时间:2023-11-30 03:55:05 25 4
gpt4 key购买 nike

我使用漂亮的 libevent 库在单独的线程中实现了一个小型网络服务器。 Web 服务器运行 event_base_dispatch() 来处理所有事件。我需要的是一种从主线程中打破这个调度循环的方法。

它归结为以下 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() 将继续运行直到您获取另一个网页。只有这样循环才会中止并且程序终止。

最佳答案

如果您需要在运行任何回调之前退出事件循环,请使用 event_base_break()

http://www.wangafu.net/~nickm/libevent-book/Ref3_eventloop.html#_stopping_the_loop

关于c++ - 如何打破 libevent 的调度循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29219314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com