Jessica CHEN Joy and Loneliness CATEGORIES TIMEMACHINE TAGS GEMS

一个数据队列多个工作线程的模型的考虑

[ iocp  workthread  ]

本来用完成端口的PostQueuedCompletionStatus和GetQueuedCompletionStatus这两个函数实现应该非常完美。 多个工作线程阻塞在GetQueuedCompletionStatus中等候, 由一个调度线程负责用PostQueuedCompletionStatus投递任务,每投一个就会有一个工作线程的GetQueuedCompletionStatus被满足然后处理。 这样调度线程就不会卡住。 不过google了一下,发现下面的讨论: http://www.ureader.com/msg/1474282.aspx 结论是IOCP不适合这种模型,这种模型用CRITICAL_SECTION+EVENT来调度会更好。 仔细想了一下,其实CRITICAL_SECTION也不需要,只需要EVENT再加一个标志位(声明为volatile,并用InterlockedIncrement和InterlockedDecrement来增减), 工作线程完成任务时将标志位置为空闲,并阻塞在EVENT上,(这个EVENT每个工作线程都有一个)。 调度线程每次找一个空闲的工作线程,并将标志设为忙碌,再将EVENT设为有信号以唤醒工作线程即可。