我即将实现一个带有工作项队列的工作线程,当我在思考这个问题时,我想知道我是否在做最好的事情。
所谓的线程将需要一些线程本地数据(在构造时预初始化),并且将循环处理工作项,直到满足某些条件为止。
伪代码:
volatile bool run = true;
int WorkerThread(param)
{
localclassinstance c1 = new c1();
[other initialization]
while(true) {
[LOCK]
[unqueue work item]
[UNLOCK]
if([hasWorkItem]) {
[process data]
[PostMessage with pointer to data]
}
[Sleep]
if(!run)
break;
}
[uninitialize]
return 0;
}
我想我会通过关键部分进行锁定,因为队列将是std::vector或std::queue,但也许有更好的方法。使用Sleep的部分看起来不太好,因为会有很多额外的Sleep和大Sleep值,或者在Sleep值很小的时候会有很多额外的锁定,这是绝对不必要的。但是,我想不到一个可以替代关键部分的WaitForSingleObject友好原语,因为可能会有两个线程同时排队工作项。因此,Event似乎是最佳候选,如果Event已经设置,则可能会丢失第二个工作项,并且它不能保证互斥。也许甚至有更好的方法,使用InterlockedExchange之类的函数,可以导致更少的序列化。附注:在取消排队阶段,我可能需要预处理整个队列并丢弃过时的工作项。