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

标签 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 项目问题,而不是出于任何实际原因。

最佳答案

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

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

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

相关文章:

c++ - 使用 boost::hana::is_valid 验证有效调用存在困难

python - 如何限制 python 中的事件线程数?

c - 使用 System V 的共享内存 IPC 的 Posix 线程

SQL 字段作为其他字段的总和

sql - GROUP BY SQL Server 后的总和百分比

c++ - 如何执行运算符重载以避免 C++ 中的 if 条件?

c++ - 我们可以在 O(1) 时间内反转一个堆栈吗

arrays - 如何在 Scala 中获取数组列表中两个元素的总和

c++ - 如何为vector <string>分配类值?

java - thread.run() 有效,而 thread.start() 无效