使用信号量管理更新全局

时间:2012-12-12 03:50:58

标签: c multithreading semaphore

我正在开发一个项目,我有一个线程根据用户输入的数字生成线程。我目前有一个程序使用一个线程,它找到一个1000万整数数组中最大的素数。我想要做的是使用一个结构为每个线程分配一个数组的块,但是一旦我传入多个线程,后续的线程永远不会去。打印报表是我的数据跟踪

目前,如果我输入两个线程,索引最多只能达到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);

}

1 个答案:

答案 0 :(得分:0)

我敢打赌,错误的是你忘了将代码括在if更新largePrimeNumber的地方,这样就搞砸了。

但是,为了保护变量,我会做以下事情:

声明某处,因此它对线程来说是全局的:

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

干杯