所有素数低于200万的总和,线程给出错误答案

时间:2015-04-01 05:12:02

标签: c++ multithreading sum

所以我的代码正确获取所有素数是这个并给出结果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项目问题而不是出于任何实际原因。

1 个答案:

答案 0 :(得分:1)

你的程序与sum有数据竞争。 你有三个选择,首先使用原子类型的变量,第二个使用线程局部变量。或者使用不同的var名称作为sum0,1 .. 当所有线程都运行时,将它们加在一起。

如果您可以使用C ++ 11,atomicthread_local可能符合您的需要。