【发布时间】:2010-03-31 05:00:12
【问题描述】:
我有一个包含 1000 个工作项的队列和一台 n-proc 机器(假设 n = 4). 主线程一次产生 n (=4) 个工作线程 ( 25 个外部 迭代)并在处理之前等待所有线程完成 接下来的 n (=4) 个项目,直到整个队列被处理完
for(i= 0 to queue.Length / numprocs)
for(j= 0 to numprocs)
{
CreateThread(WorkerThread,WorkItem)
}
WaitForMultipleObjects(threadHandle[])
每个(工作者)线程所做的工作不是同质的。因此在 如果线程 1 花费 1000 秒做工作,则 1 批(n 个),其余的 3 线程只有 1 秒,以上设计效率低下,因为 1 秒后 其他 3 个处理器处于空闲状态。此外没有池 - 1000 正在创建不同的线程
如何使用 NT 线程池(我不够熟悉 - 因此 冗长的问题)和 QueueUserWorkitem 来实现上述目标。这 以下约束应该成立
- 主线程要求所有工作项在处理之前 它可以继续进行。所以我认为上面的构造类似waitall 是必需的
- 我想创建与处理器一样多的线程(即不是 1000 个线程 一次)
- 另外我不想创建 1000 个不同的事件,传递给工作人员 线程,并使用 QueueUserWorkitem API 等待所有事件或 否则
- 现有代码是 C++。首选 C++,因为我不懂 c#
我怀疑以上是一种非常常见的模式,并且正在寻找 你们的意见。
【问题讨论】:
-
“我也不想创建 1000 个不同的事件,传递给工作线程,并使用 QueueUserWorkitem API 或其他方式等待所有事件”--- 为什么不呢?对我来说似乎是一种合理的方法。
标签: multithreading