c-使用信号量管理全局更新



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

目前,如果我输入两个线程,索引最多只能达到500000。这里是派生线程函数和工作函数。我不明白为什么其他线程不工作。我在它更新全局变量以保护它的部分周围有信号量。创建线程中的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: %dn", si);
for(i = si; i < nc; i++){
if(i%100000==0)
printf("Here is i: %dn", i);
if(entries[i]%2 != 0){
if(entries[i] > currentPack->largestPrime){      
if(prime(entries[i])){
currentPack->largestPrime = entries[i];
printf("%lun", 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: %dn", 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: %dn", 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 createdn");
sIndex += count;
}
for(i = 0; i < y; i++)
pthread_join(workers[i], NULL);
}

我敢打赌,错误是您忘记将代码放在更新largestPrimeNumber的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);

干杯

最新更新