【发布时间】:2014-12-10 11:40:28
【问题描述】:
要求:一个 UDP 服务器,它在接收到 UDP 数据包并将接收到的数据包存储到两个队列之一。每个队列关联一个工作线程,关联线程从队列的最前面提取数据包,处理后写入内存缓存系统。
约束:解决方案必须基于事件循环(libuv)并用C编写
我的解决方案
为传入的 UDP 注册一个回调,它将接收到的数据包添加到两个队列之一并引发 uv_async_send
为每个队列创建两个全局 uv_sync_t 对象,并用作 uv_async_send 的参数。例如:如果数据包被添加到 queue-one,那么 uv_sync_t object-1 被用作 uv_async_send 的参数。类似地,如果数据包被添加到 queue-2,那么使用 uv_sync_t object-2
-
两个线程被启动,每个线程都有自己的循环和一个与回调绑定的句柄
- 在线程一中,uv_sync_t 对象 1 被绑定到一个函数(比如 funcA)。 在线程二中,uv_sync_t object-2 被绑定到另一个函数(比如 funcB)
- funcA 和 funcB 从相应队列中读取“SINGLE”数据包并存储在内存缓存中
问题 客户端发送大量数据包,这些数据包在服务器中注册了大量事件。现在的问题是 libuv 将多个调用合并为一个并调用单个回调(从队列中删除一个 SINGLE 节点)。这会导致节点以更快的速度添加到队列中并以非常慢的速度移除。这些费率可以平衡吗?
有没有更好的方法来使用事件循环库 libuv 来设计服务器?
【问题讨论】:
标签: c multithreading event-loop libuv