我有一个很大的for
循环,我希望每个项目都传递给一个线程上的函数。我有一个特定大小的线程池,我想重用线程。最有效的方法是什么?
线程池最有效的大小是什么?或者至少是最好的解决方法是什么?
pthread_t thread_id[10];
int i;
for(i = 0; i < 10000000; i++) {
pthread_create(thread_id[?], NULL, threadFunc, params[i]);
}
答案 0 :(得分:1)
线程太少意味着浪费了性能机会,并且太多线程浪费了每个线程消耗的资源,并且可能由于线程之间的争用而降低性能。我会使用测量值,看看哪个数字效果最好。只是好奇,是否有理由要求每个迭代成为一个新线程?
答案 1 :(得分:0)
如果您没有阻塞线程来执行磁盘或网络I / O,则池中最有效的线程数是每个处理器一个(假设所有工作都在线程池线程上完成)。其余的工作项目应该在完成后排队等候。
答案 2 :(得分:0)
如果您想要的是使用独立迭代并行化大for
循环,也许您可以使用OpenMP。
int i;
#pragma omp parallel for
for(i = 0; i < 10000000; i++) {
// the body of your loop
}
您可以选择不同的schedule
选项和其他参数来调整行为,包括您需要的线程数;默认情况下,OpenMP将创建与可用硬件上下文一样多的线程,并在所有线程之间按比例分配工作。
答案 3 :(得分:0)
我有一个特定的线程池 大小,我想重用线程。
您可能希望了解生产者 - 消费者模式。简而言之:你首先创建你的线程,它调用一些func,如果有的话,返回要处理的东西,或者只有块线程(如果没有)。 它可以通过CreateUserACP(或QueueUserACP)或{Post,Get} QueuedComplentionStatus API在Windows中实现。 在UNIXies中 - 使用pthread_cond_ *或pthread_workqueue_ *调用。