gpt4 book ai didi

c++ - 线程给出错误答案的 200 万以下所有素数的总和

转载 作者:行者123 更新时间:2023-11-30 05:45:25 24 4
gpt4 key购买 nike

所以我正确获取所有质数的代码是这样的,并给出结果 142,913,828,922。

素数求和循环

for (int i = 2; i < 2000001; i++){
if (isPrime(i)){
sum += i;
}
}

但是当我最初尝试创建它时,我决定尝试将任务分配到线程中以便它运行得更快,而我最初想到的是:

主要是:

thread first(threadF, 2, 1000001, std::ref(sum));
thread second(threadF, 1000000, 1750001, std::ref(sum));
thread third(threadF, 1750000, 1900001, std::ref(sum));
thread fourth(threadF, 1900000, 2000001, std::ref(sum));
first.join();
second.join();
third.join();
fourth.join();

threadF 是

void threadF(int lowerBound, int upperBound, unsigned long long int &sum){
for (lowerBound; lowerBound < upperBound; lowerBound++){
if (isPrime(lowerBound)){
sum += lowerBound;
cout << "prime" << lowerBound << endl;
}
}}

我只是将它们分开,认为更高的数字需要更长的时间,但没有做任何数学来确定我应该如何分开它们。我的问题是,当我使用线程时,我没有得到一致的答案。每次,我都接近其他方法的解决方案,但从来都不准确,而且答案并不总是相同的。通常他们会相差几百万左右。我这样做只是为了学习一些关于线程的知识,同时解决一个 eulers 项目问题,而不是出于任何实际原因。

最佳答案

您的程序与总和存在数据竞争。你有三个选择,第一个使用原子类型的变量,第二个,使用线程局部变量。或者使用不同的 var name 作为 sum0,1..当所有线程运行结束时,将它们加在一起。

如果你可以使用 C++11,atomicthread_local也许能满足您的需求。

关于c++ - 线程给出错误答案的 200 万以下所有素数的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29383275/

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