所以我的代码正确获取所有素数是这个并给出结果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项目问题而不是出于任何实际原因。
答案 0 :(得分:1)
你的程序与sum有数据竞争。 你有三个选择,首先使用原子类型的变量,第二个使用线程局部变量。或者使用不同的var名称作为sum0,1 .. 当所有线程都运行时,将它们加在一起。
如果您可以使用C ++ 11,atomic或thread_local可能符合您的需要。