gpt4 book ai didi

c - 在循环迭代之间等待线程池中的线程

转载 作者:太空狗 更新时间:2023-10-29 15:41:03 24 4
gpt4 key购买 nike

我有几个程序在做一堆计算,因为我的新电脑有一个多核处理器,我决定重写我的程序以实现多线程。我找到了 Johan Hanssen Seferidis 的 thpool library并且正在尝试使用它。

我有一个小循环(比如 0 < j < 12)嵌入在一个大循环(0 < i < 40000)中。对于 i 的每次迭代小型 j-loop 将其工作分配给线程池。每个 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

执行上述应该(即我想要的)按顺序写入五个 block 0-9、10-19、...、40-49,但每个 block 的元素可能或多或少是随机顺序.相反,程序通过整个 i-loop 的速度太快了,所以当线程开始写入 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: %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);
}

然后看看区别。祝你好运。

关于c - 在循环迭代之间等待线程池中的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14754589/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com