c++ - 学习多线程。试图做一个质数查找器

标签 c++ multithreading primes

我正在为一个 uni 项目学习,其中一项要求是包括多线程。我决定制作一个质数查找器,虽然它可以工作,但速度相当慢。我最好的猜测是这与我正在创建和销毁的线程数量有关。

我的方法是采用低于 N 的素数范围,并将它们平均分布在 M 个线程中(其中 M = 核心数(在我的例子中为 8)),但是每次 N 时都会创建和销毁这些线程增加。

伪代码如下所示:

for each core
  # new thread
  for i in (range / numberOfCores) * currentCore
    if !possiblePrimeIsntActuallyPrime
      if  possiblePrime % i == 0
        possiblePrimeIsntActuallyPrime = true
        return
    else
      return

这确实有效,但是为每个可能的素数创建 8 个线程似乎会减慢系统速度。

关于如何进一步优化它有什么建议吗?

最佳答案

使用线程池。

创建8个线程并将它们存储在一个数组中。每次结束并重新开始时,都会向其提供新数据。这将避免每次都必须创建和销毁它们。

此外,在计算要检查的数字范围时,只检查 ceil(sqrt(N)) 因为之后的任何内容都保证不会进入它或其他相应的因素已经已经检查过了。即 ceil(sqrt(24)) 是 5。

检查 5 之后就不需要再检查任何其他内容,因为 6 进入 24 4 次并且检查了 4 次,8 次进入 3 次并且检查了 3 次,等等。

关于c++ - 学习多线程。试图做一个质数查找器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50053144/

相关文章:

c++ - 如何使用 Gtk::Builder 将正确的 Glib::RefPtr 存储到非小部件

java - Netty 4 中可以并发读取吗?

python - 当我尝试内存时,为什么我的代码会变慢?

math - 小数的最快素数测试

java - 有没有更有效的方法来编写以下质数代码?

c++ - CUDA 中 2D 三角形平滑的正确网格和 block 尺寸是多少?

c++ - 默认构造函数和对象复制

c++ - 在堆栈内存中销毁的对象

Java - 在使用 JButton 执行时暂停线程池

java - 继承自Thread的一个类让CPU运行100%