我有几个程序在做一堆计算,由于我的新电脑有一个多核处理器,我决定重写程序以实现多线程。我找到了约翰·汉森·塞费里迪斯的thpool图书馆,并试图与之合作。
我在一个较大的循环(0 < i < 40000
)中嵌入了一个小循环(比如0 < j < 12
)。对于i
的每次迭代,小j循环将其工作分配给线程池。每个j都有一件工作。线程会出现并抓取任何未被拿走的东西。我需要一种方法让大型I循环等待,直到所有线程都完成了在j循环中的工作,以及任何I/O操作,然后继续使用I++。
简单示例代码:
#include <stdio.h>
#include "thpool.h"
int i;
void task1(int a){
printf("# Thread working: %un", (int)pthread_self());
printf(" Task 1 running..n");
printf("%dn", 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();
}
};
有什么想法吗?加入?退出?信号量?这对我来说是全新的,所以谢谢你的耐心。
我建议使用这样的信号量:
#include <stdio.h>
#include <semaphore.h>
#include "thpool.h"
int i;
sem_t sem;
void
task1(int a)
{
sem_post(&sem);
printf("# Thread working: %un", (int)pthread_self());
printf(" Task 1 running..n");
printf("%dn", 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: %un", (int)pthread_self());
printf(" Task 1 running..n");
printf("%dn", 10*i+a);
sem_post(&sem);
}
看看区别。祝你好运