Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在libevent中使用EVLOOP_NONBLOCK_C++_Libevent - Fatal编程技术网

C++ 在libevent中使用EVLOOP_NONBLOCK

C++ 在libevent中使用EVLOOP_NONBLOCK,c++,libevent,C++,Libevent,在libevent中,我添加了以下代码: while (run) { event_base_loop(base, EVLOOP_NONBLOCK | EVLOOP_ONCE); } 如果我将其与以下内容进行比较: event_base_dispatch(base); 这两个语句相等吗?否,event\u base\u dispatch(base)调用相当于event\u base\u loop(base,0),这意味着它既不会在第一批事件之后停止(如event\u base\u loop

libevent
中,我添加了以下代码:

while (run) {
  event_base_loop(base, EVLOOP_NONBLOCK | EVLOOP_ONCE);
}
如果我将其与以下内容进行比较:

event_base_dispatch(base);

这两个语句相等吗?

否,
event\u base\u dispatch(base)
调用相当于
event\u base\u loop(base,0)
,这意味着它既不会在第一批事件之后停止(如
event\u base\u loop
使用
EVLOOP\u一次),也不会在没有事件就绪时立即返回(如
event\u base\u loop
with
EVLOOP\u NONBLOCK
does)


你可能想读尼克·马修森写的一本关于libevent的好书:

你说这些语句相等是什么意思?我想把
event\u base\u dispatch(base)
改为
event\u base\u loop(base,EVLOOP\u NONBLOCK | EVLOOP\u ONCE)
出于某种原因,但我无法评估风险。谢谢Remi。我想在事件循环中做些事情,所以我尝试使用
while(运行)event_base_loop(base,EVLOOP_NONBLOCK | EVLOOP_ONCE)
而不是
event_base_dispatch(base)
。这有效率问题还是其他风险?在event_base_loop上循环(base,EVLOOP_NONBLOCK | EVLOOP_ONCE)的效率略低于简单地执行event_base_dispatch()。我可以问一下您正在尝试做什么吗?您是否尝试过使用计时器事件或使用event_base_loopbreak()执行此操作?我有一个网络线程和一个用户线程,网络线程调用
event_base_loop
(详细信息:
while(run){event_loop;MyUpdate();}
)。我尝试在用户线程中调用函数
bufferevent_socket_connect
,但它不起作用(线程不安全?)所以,我这样做:用户线程:将连接请求推送到请求缓冲区;网络线程:1.在请求缓冲区上循环2.获取连接请求3.调用buffervent_socket_connect进行连接。我不明白为什么需要退出循环?关于libevent和线程,根据我的经验,请参阅libevent实际上不是线程安全的。一些API在多线程环境中无法正常工作。最糟糕的是,从其他线程调用
bufferevent\u free
将导致死锁()。因此,我尝试在网络线程中调用bufferevent API,用户线程只是向网络线程发送一些请求,而不是直接调用bufferevent API。我需要跳出循环,处理用户线程请求。