Multithreading 寻求MT设计模式的帮助
我有一个1000个工作项的队列和一个n-proc机器,假设n= 4.主线程一次生成n=4个工作线程 迭代并等待所有线程在处理之前完成 接下来的n=4项,直到处理完整个队列Multithreading 寻求MT设计模式的帮助,multithreading,Multithreading,我有一个1000个工作项的队列和一个n-proc机器,假设n= 4.主线程一次生成n=4个工作线程 迭代并等待所有线程在处理之前完成 接下来的n=4项,直到处理完整个队列 for(i= 0 to queue.Length / numprocs) for(j= 0 to numprocs) { CreateThread(WorkerThread,WorkItem) } WaitForM
for(i= 0 to queue.Length / numprocs)
for(j= 0 to numprocs)
{
CreateThread(WorkerThread,WorkItem)
}
WaitForMultipleObjects(threadHandle[])
每个辅助线程所做的工作是不均匀的
如果线程1花费1000秒做功,其余3个线程则为1批n
线程仅1秒,以上设计效率低,因为1秒后
其他3个处理器处于空闲状态。此外,没有池-1000
正在创建不同的线程
如何使用我不太熟悉的NT线程池-因此
冗长的问题和QueueUserWorkitem来实现上述功能。这个
以下约束条件应适用
主线程要求处理所有工作项
它可以继续,所以我认为上面的waitall结构
是必需的
我想创建和处理器一样多的线程,而不是1000个线程
一次
另外,我不想创建1000个不同的事件,请传递给工人 线程,并使用QueueUserWorkitem API或 否则 ExcIngNeg代码是C++的,喜欢C++,因为我不知道C 我怀疑以上是一个非常常见的模式,我一直在寻找
你的输入。 我不是C++程序员,所以我给你一些半个伪代码,
tcount = 0
maxproc = 4
while queue_item = queue.get_next() # depends on implementation of queue
# may well be:
# for i=0; i<queue.length; i++
while tcount == maxproc
wait 0.1 seconds # or some other interval that isn't as cpu intensive
# as continously running the loop
tcount += 1 # must be atomic (reading the value and writing the new
# one must happen consecutively without interruption from
# other threads). I think ++tcount would handle that in cpp.
new thread(worker, queue_item)
function worker(item)
# ...do stuff with item here...
tcount -= 1 # must be atomic
另外,我不想创建1000个不同的事件,传递给工作线程,并使用QueueUserWorkItemAPI等待所有事件,否则为什么不呢?对我来说似乎是一个合理的方法。事实上,这是你能得到的最有效的方法。它将其限制为4个工作线程,并在给定的等待时间内,在任何线程可用时立即执行下一项。唯一的问题是工作线程必须处理一个外部变量,这可能会打破一些好的约定,但只需对其进行注释就可以清楚地表明这一点,这是一个非常有效的攻击。