lacewing 路由模式
原创
©著作权归作者所有:来自51CTO博客作者wx637304bacd051的原创作品,请联系作者获取转载授权,否则将追究法律责任
1.start_eventloop 模式(阻塞模式)
可以看出这是最符合完成端口模式,由数据驱动。如果没有数据则一直阻塞或者发生错误。
注意:start_eventloop 一次则调用GetQueuedCompletionStatus反过来来说,如果我们需要实现完成端口多线程模式,那么我们需要调用多次start_eventloop 。同时对应的退出事件我们也应该调用多次post_eventloop_exit
//成对出现,调用多少次start_eventloop,则调用多少次post_eventloop_exit
//eventpump->start_eventloop();
//eventpump->post_eventloop_exit();
start_eventloop 多线程实现
//启动完成端口的线程数量
SYSTEM_INFO si;
GetSystemInfo(&si);
int nProcessors = si.dwNumberOfProcessors*2;
HANDLE *phThread = new HANDLE[nProcessors];
for (int i = 0; i < nProcessors; ++i)
{
phThread[i] = CreateThread(NULL, 0, _work_thread, eventpump, 0, NULL);
}
//成对出现
//eventpump->start_eventloop();
//eventpump->post_eventloop_exit();
WaitForMultipleObjects(nProcessors, phThread, TRUE, INFINITE);
DWORD WINAPI _work_thread(LPVOID lparam)
{
#这里应该增加事件,通知退出的。demo忽略
lacewing::eventpump pump = (lacewing::eventpump)lparam;
pump->start_eventloop();
return 0;
}
2.tick 模式(获取当前拥有的所有数据,直至数据为空)
从源码看出,等待时间是0,如果没有数据则是TIMEOUT。如果有数据则会循环调用process,直至没有数据为止。
tick 多线程实现
参考start_eventloop,但是需要在线程里面while循环获取
DWORD WINAPI _work_thread(LPVOID lparam)
{
lacewing::eventpump pump = (lacewing::eventpump)lparam;
//pump->start_eventloop();
while (true)
{
pump->tick();
//等待时机不好确定,没有start_eventloop 好实用
Sleep(10);
}
return 0;
}
3.start_sleepy_ticking(tick的改良模式,由事件驱动)
当接收到tick事件的时候需要在on_tick_needed中进行数据获取
void on_tick_needed(lacewing::eventpump pump)
{
pump->tick();
}
start_sleepy_ticking多线程实现(不支持上述方式,只能外面入队列,然后多线程处理数据),