我有几个程序进行大量计算,由于我的新计算机有一个多核处理器,我决定重写我的程序以进行多线程处理。我找到了 Johan Hanssen Seferidis 的thpool 库,并正在尝试使用它。
我有一个小循环(比如说0 < j < 12
)嵌入到一个更大的循环(0 < i < 40000
)中。对于i
小 j 循环的每次迭代,都会将其工作分配给线程池。每个 j 有一份工作。线程出现并抓住任何尚未被采取的东西。我需要一种方法让大型 i-loop 等待所有线程在 j-loop 中完成它们的工作,以及任何 I/O 操作,然后继续 i++。
简单示例代码:
#include <stdio.h>
#include "thpool.h"
int i;
void task1(int a){
printf("# Thread working: %u\n", (int)pthread_self());
printf(" Task 1 running..\n");
printf("%d\n", 10*i+a);
}
int main(){
int j;
#define NUM_HANDLER_THREADS 3
thpool_t* threadpool;
threadpool=thpool_init(NUM_HANDLER_THREADS);
for (i=0; i<5; i++)
for (j=0; j<10; j++) {
thpool_add_work(threadpool, (void*)task1, (void*)j);
};
sleep(2);
puts("Will kill threadpool");
thpool_destroy(threadpool);
return 0;
}
编译:
gcc main.c thpool.c -pthread -o test
执行上述操作应该(即我想要的)按该顺序编写五个块 0-9、10-19、...、40-49,但每个块的元素可能或多或少是随机顺序。相反,程序通过整个 i 循环太快了,所以当线程开始写入 i==5 时,我得到 50-59 五次,以随机顺序。
我希望我清楚我想要做什么。也许是这样的:
for (i=0; i<5; i++) {
for (j=0; j<10; j++) {
thpool_add_work(threadpool, (void*)task1, (void*)j);
wait_for_all_threads_to_finish();
}
};
有任何想法吗?加入?退出?信号量?这对我来说是全新的,所以谢谢你的耐心。