将 libev 与多个线程一起使用
using libev with multiple threads
我想将 libev 与多个线程一起使用来处理 tcp 连接。我想要的是:
-
主线程侦听传入连接,接受连接并将连接转发到工作线程。
-
我有一个工作线程池。线程数取决于中央处理器的数量。每个工作线程都有一个事件循环。工作线程侦听我是否可以在 tcp 套接字上写入,或者如果 一些可供阅读的东西。
查看了 libev 的文档,我知道这可以用 libev 完成,但我找不到任何我必须这样做的例子。
有人有例子吗?我认为我必须使用 ev_loop_new() api,对于工作线程和主线程,我必须使用 ev_default_loop() ?
问候
以下代码可以扩展到多个线程
//This program is demo for using pthreads with libev.
//Try using Timeout values as large as 1.0 and as small as 0.000001
//and notice the difference in the output
//(c) 2009 debuguo
//(c) 2013 enthusiasticgeek for stack overflow
//Free to distribute and improve the code. Leave credits intact
#include <ev.h>
#include <stdio.h> // for puts
#include <stdlib.h>
#include <pthread.h>
pthread_mutex_t lock;
double timeout = 0.00001;
ev_timer timeout_watcher;
int timeout_count = 0;
ev_async async_watcher;
int async_count = 0;
struct ev_loop* loop2;
void* loop2thread(void* args)
{
printf("Inside loop 2"); // Here one could initiate another timeout watcher
ev_loop(loop2, 0); // similar to the main loop - call it say timeout_cb1
return NULL;
}
static void async_cb (EV_P_ ev_async *w, int revents)
{
//puts ("async ready");
pthread_mutex_lock(&lock); //Don't forget locking
++async_count;
printf("async = %d, timeout = %d n", async_count, timeout_count);
pthread_mutex_unlock(&lock); //Don't forget unlocking
}
static void timeout_cb (EV_P_ ev_timer *w, int revents) // Timer callback function
{
//puts ("timeout");
if (ev_async_pending(&async_watcher)==false) { //the event has not yet been processed (or even noted) by the event loop? (i.e. Is it serviced? If yes then proceed to)
ev_async_send(loop2, &async_watcher); //Sends/signals/activates the given ev_async watcher, that is, feeds an EV_ASYNC event on the watcher into the event loop.
}
pthread_mutex_lock(&lock); //Don't forget locking
++timeout_count;
pthread_mutex_unlock(&lock); //Don't forget unlocking
w->repeat = timeout;
ev_timer_again(loop, &timeout_watcher); //Start the timer again.
}
int main (int argc, char** argv)
{
if (argc < 2) {
puts("Timeout value missing.n./demo <timeout>");
return -1;
}
timeout = atof(argv[1]);
struct ev_loop *loop = EV_DEFAULT; //or ev_default_loop (0);
//Initialize pthread
pthread_mutex_init(&lock, NULL);
pthread_t thread;
// This loop sits in the pthread
loop2 = ev_loop_new(0);
//This block is specifically used pre-empting thread (i.e. temporary interruption and suspension of a task, without asking for its cooperation, with the intention to resume that task later.)
//This takes into account thread safety
ev_async_init(&async_watcher, async_cb);
ev_async_start(loop2, &async_watcher);
pthread_create(&thread, NULL, loop2thread, NULL);
ev_timer_init (&timeout_watcher, timeout_cb, timeout, 0.); // Non repeating timer. The timer starts repeating in the timeout callback function
ev_timer_start (loop, &timeout_watcher);
// now wait for events to arrive
ev_loop(loop, 0);
//Wait on threads for execution
pthread_join(thread, NULL);
pthread_mutex_destroy(&lock);
return 0;
}
同时
在不同的线程中使用 libev 是可以的,只要每个线程都运行自己的循环[1]。libev (ev++.h) 中的 c++ 包装器始终使用默认循环,而不是让您指定要使用的循环。你应该使用 C 标头 (ev.h),它允许您指定使用哪个循环(例如,ev_io_start 获取指向ev_loop的指针,但 ev::io::start 没有)。
您可以通过ev_async安全地发出另一个线程ev_loop的信号。
[1]http://doc.dvgu.ru/devel/ev.html#threads_and_coroutines
相关文章:
- C++无锁队列与多个线程一起崩溃
- QSocketNotifier:只能与以 QThread 错误开头的线程一起使用
- 无法将线程与第三方库一起暂停
- SetWindowShookex(WH_KEYBOARD)无法与线程ID一起使用
- 与多线程一起登录多进程应用程序
- 读者-作家-作家线程总是与多个读者线程纠缠在一起
- 如何将 Lambda 表达式与多线程一起使用
- 线程池与英特尔线程构建模块一起使用
- 我可以将 Boost.Geometry.index.rtree 与线程一起使用吗?
- 无法获得提升::线程与MSVS2013一起工作
- 如何将非阻塞套接字与多个线程一起使用
- 如何使 CDT/Eclipse 与 C++11 线程一起工作
- Qt同步原语可以与非QThread线程一起使用吗
- 代码步进如何与线程一起工作
- 与icc 14一起使用多线程运行时库时的错误
- 无效地将void表达式与线程和对象一起使用
- 如何将线程与递归模板函数一起使用
- 将 MPI 与线程一起使用的正确方法是什么
- 将 std::atomic_flag 与工作线程一起使用时出现问题
- 将 libev 与多个线程一起使用