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



我有几个程序在做一堆计算,由于我的新电脑有一个多核处理器,我决定重写程序以实现多线程。我找到了约翰·汉森·塞费里迪斯的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);
    }

看看区别。祝你好运

相关内容

  • 没有找到相关文章

最新更新