我有一些程序正在做一堆计算,而且由于我的新计算机有一个多核处理器,我决定重写我的多线程程序。我找到了Johan Hanssen Seferidis'thpool library并且正在尝试使用它。
我有一个小循环(比如0 < j < 12
)嵌入一个更大的循环(0 < i < 40000
)。对于i
的每次迭代,小j循环将其工作发布给线程池。每个j都有一项工作。线程出现并抓住任何未被捕获的东西。我需要一种方法让大型i循环等到所有线程完成它们在j循环中的工作,以及任何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
执行上述应该(即我想要的)按顺序写出5个块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();
}
};
有什么想法吗?加入?退出?信号灯?这对我来说都是新手,所以感谢您的耐心等待。
答案 0 :(得分:1)
我建议使用这样的信号量:
#include <stdio.h>
#include <semaphore.h>
#include "thpool.h"
int i;
sem_t sem;
void
task1(int a)
{
sem_post(&sem);
printf("# Thread working: %u\n", (int)pthread_self());
printf(" Task 1 running..\n");
printf("%d\n", 10*i+a);
}
int
main(void)
{
int j;
if (sem_init(&sem, 0, 0) == -1)
abort();
#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);
sem_wait(&sem);
}
}
sleep(2);
puts("Will kill threadpool");
thpool_destroy(threadpool);
return 0;
}
也可以尝试使用:
void
task1(int a)
{
printf("# Thread working: %u\n", (int)pthread_self());
printf(" Task 1 running..\n");
printf("%d\n", 10*i+a);
sem_post(&sem);
}
看看差异。祝你好运。