0

ユーザーが入力した数値に基づいてスレッドを生成するスレッドがあるプロジェクトに取り組んでいます。現在、プログラムは 1 つのスレッドで動作しており、1,000 万の整数配列で最大の素数を見つけます。私がやろうとしているのは、構造体を使用して各スレッドに配列のブロックを割り当てることですが、複数のスレッドを渡すと、後続のスレッドは決して行きません。印刷ステートメントは私のデータ追跡です

現在、2 つのスレッドを入力すると、インデックスは 500,000 までしか取得できません。ここでは、スポーン スレッド関数と作業関数です。他のスレッドが機能しない理由がわかりません。グローバル変数を更新して保護するセクションの周りにセマフォがあります。作成スレッドの if ステートメントは、奇数スレッドの配列の末尾を取得しています。スレッドを正常に作成し、正しい情報を送信しているようです。

私は昼夜を問わずこの作業に取り組んでおり、実際にスレッドを機能させる必要があります。よろしくお願いいたします。ここにいる人々を助けることができる日が待ちきれません。stackoverflow を支援し、助けてくれた素晴らしいコミュニティに本当に感謝したいと思います。

void* findPrime(void* pack_array)
{

  pack* currentPack =  pack_array;
  unsigned int lp = currentPack->largestPrime;
  unsigned int si = currentPack->startingIndex;
  unsigned int nc = currentPack->numberCount;

  int i;
  printf("Starting index Count: %d\n", si);
  for(i = si; i < nc; i++){
    if(i%100000==0)
      printf("Here is i: %d\n", i);
    if(entries[i]%2 != 0){
      if(entries[i] > currentPack->largestPrime){      
    if(prime(entries[i])){

      currentPack->largestPrime = entries[i];
      printf("%lu\n", currentPack->largestPrime);

    if(currentPack->largestPrime > largestPrimeNumber)
      sem_wait(&semHold);
      largestPrimeNumber = currentPack->largestPrime;
      sem_post(&semHold);
    }
      }    
    }
  }

}

void* assign(void* num)
{

  int y = (int)num;
  int i;

  int count = 10000000/y;
  int finalCount = count + (10000000%y);

  int sIndex = 0;
  printf("This is count: %d\n", count);
  printf("This is final count: %d", finalCount);


  pthread_t workers[y]; //thread to do the workers


  for(i = 0; i < y; i++){
    printf("for thread %d Starting index: %d\n", i, sIndex);
    if(i == (y-1)){
      pack_array[i].largestPrime = 0;
      pack_array[i].startingIndex = sIndex;
      pack_array[i].numberCount = finalCount;
    }

    pack_array[i].largestPrime = 0;
    pack_array[i].startingIndex = sIndex;
    pack_array[i].numberCount = count;


    pthread_create(&workers[i], NULL, findPrime, (void *)&pack_array[i]);
    printf("thread created\n");
    sIndex += count;

  }
  for(i = 0; i < y; i++)
    pthread_join(workers[i], NULL);

}
4

1 に答える 1

0

エラーは、largePrimeNumber を更新する if でコードを囲むのを忘れたことに違いありません。

ただし、変数を保護するには、代わりに次のようにします。

スレッドに対してグローバルになるようにどこかで宣言します。

pthread_mutex_t aMutex = PTHREAD_MUTEX_INITIALIZER;

そして代用

if(currentPack->largestPrime > largestPrimeNumber)
  sem_wait(&semHold);
  largestPrimeNumber = currentPack->largestPrime;
  sem_post(&semHold);

このため:

pthread_mutex_lock(&aMutex);
if(currentPack->largestPrime > largestPrimeNumber)
  largestPrimeNumber = currentPack->largestPrime;
pthread_mutex_unlock(&aMutex);

乾杯

于 2012-12-19T11:31:15.623 に答える