gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:56:03 25 4
gpt4 key购买 nike

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

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

}

最佳答案

我敢打赌,错误是您忘记在更新largestPrimeNumber的地方附上代码,这一切都搞砸了。

但是,为了保护变量,我会执行以下操作:

在某个地方声明它对于线程来说是全局的:

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

干杯

关于c - 使用信号量来管理更新全局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13832467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com