所以我正确获取所有质数的代码是这样的,并给出结果 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,atomic或 thread_local也许能满足您的需求。
关于c++ - 线程给出错误答案的 200 万以下所有素数的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29383275/