gpt4 book ai didi

C++指定范围之间的多线程素数计数器

转载 作者:搜寻专家 更新时间:2023-10-31 01:38:08 27 4
gpt4 key购买 nike

#include <math.h>
#include <sstream>
#include <iostream>
#include <mutex>
#include <stdlib.h>
#include <chrono>
#include <thread>

bool isPrime(int number) {
int i;

for (i = 2; i < number; i++) {
if (number % i == 0) {
return false;
}
}

return true;
}

std::mutex myMutex;

int pCnt = 0;

int icounter = 0;

int limit = 0;


int getNext() {
std::lock_guard<std::mutex> guard(myMutex);
icounter++;
return icounter;
}

void primeCnt() {
std::lock_guard<std::mutex> guard(myMutex);
pCnt++;
}

void primes() {
while (getNext() <= limit)
if (isPrime(icounter))
primeCnt();
}

int main(int argc, char *argv[]) {
std::stringstream ss(argv[2]);
int tCount;
ss >> tCount;

std::stringstream ss1(argv[4]);
int lim;
ss1 >> lim;

limit = lim;

auto t1 = std::chrono::high_resolution_clock::now();

std::thread *arr;
arr = new std::thread[tCount];

for (int i = 0; i < tCount; i++)
arr[i] = std::thread(primes);

for (int i = 0; i < tCount; i++)
arr[i].join();

auto t2 = std::chrono::high_resolution_clock::now();

std::cout << "Primes: " << pCnt << std::endl;
std::cout << "Program took: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() <<
" milliseconds" << std::endl;
return 0;
}

您好,我正在尝试查找用户指定范围之间的素数数量,即 1-1000000 和用户指定的线程数量以加快该过程,但是,它似乎需要相同的时间与一个线程相比,任意数量的线程。我不确定它是否应该是那样的,或者我的代码中是否有错误。提前谢谢你!

最佳答案

您看不到性能提升,因为花费在 isPrime() 上的时间远小于线程在互斥体上争用的时间。

一种可能的解决方案是使用原子操作,如@The Badger建议。另一种方法是将您的任务划分为更小的任务,并将它们分布在您的线程池中。

例如,如果你有n个线程,那么每个线程应该测试从i*(limit/n)(i+1)*的数字(limit/n),其中i是线程号。这样您根本不需要进行任何同步,并且您的程序将(理论上)线性扩展。

关于C++指定范围之间的多线程素数计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33251330/

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