4

大量の計算を行うプログラムがいくつかありますが、新しいコンピューターにはマルチコア プロセッサが搭載されているため、プログラムをマルチスレッド用に書き直すことにしました。Johan Hanssen Seferidis のthpool ライブラリを見つけて、それを使用しようとしています。

大きなループ ( )に小さなループ (0 < j < 12など) が埋め込まれています0 < i < 40000。小さな j ループの反復ごとにi、その作業がスレッドプールに割り当てられます。各 j に対して 1 つの作品があります。スレッドが立ち上がり、取得されていないものをすべて取得します。すべてのスレッドが j ループでの作業を終了し、I/O 操作も終了するまで大きな i ループを待機させてから、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 を 5 回取得します。

私がやろうとしていることを明確にしていただければ幸いです。多分このようなもの:

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();
  }
};

何か案は?接合?終了しますか?セマフォ?これは私にとってすべて新しいことですので、しばらくお待ちください。

4

1 に答える 1

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);
    }

そして違いを見てください。幸運を。

于 2013-02-08T06:57:53.333 に答える