Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 线程的最小运行时间_C++_Multithreading - Fatal编程技术网

C++ 线程的最小运行时间

C++ 线程的最小运行时间,c++,multithreading,C++,Multithreading,我有一些函数可以检查给定范围内的素数,并将结果输出到文本文件。该函数还要求用户输入该函数将使用多少线程 #include "threads.h" #include <thread> #include <ctime> bool isPrime(int n) { if (n == 2) return true; int i = 2; while (i < n) if (n % i++ == 0)

我有一些函数可以检查给定范围内的素数,并将结果输出到文本文件。该函数还要求用户输入该函数将使用多少线程

#include "threads.h"
#include <thread>
#include <ctime>

bool isPrime(int n)
{
    if (n == 2)
        return true;

    int i = 2;
    while (i < n)
        if (n % i++ == 0)
            return false;

    return true;
}

void writePrimesToFile(int begin, int end, ofstream& file)
{
    for (int i = (begin % 2 == 0 ? begin + 1 : begin); i <= end; i += 2)
        if (isPrime(i))
            file << i << endl;
}
void callWritePrimesMultipleThreads(int begin, int end, string filePath, int N)
{
    ofstream file(filePath);
    if (file.is_open())
    {
        clock_t time = clock();
        for (int i = 0; i < N; i++)
        {
            int _begin = ((end - begin) / N) * i,
                _end = ((end - begin) / N) * (i + 1);
            thread t(writePrimesToFile, ref(_begin), ref(_end), ref(file));
            t.join();
        }

        cout << "Time elpased: " << (double(clock() - time) / CLOCKS_PER_SEC) << endl;
        file.close();
    }
    else
        cout << "Can't open file!" << endl;
}

我想知道,对于
N
的哪个值,程序运行的线程数是最好的。

这个问题的最佳解决方案是启动N个线程,每个线程运行相同的函数,增加一个共享计数器(为了线程安全,使用InterlockedIncrement),并计算它是否为素数

如果您这样做,并将N设置为机器中的内核数,您将获得最佳的100%CPU消耗,并且上下文切换为零


关于输出,请注意,如果不锁定(您希望避免锁定),就无法安全地写入一个输出文件。相反,我会收集一个数组或向量中的素数(每个线程一个向量),最终将它们合并成一个向量,对它们进行排序,然后写入文件。

它很可能与您拥有的内核数相等,但您应该对其进行分析以找出答案。这取决于很多因素,比如您拥有的硬件,操作系统,操作系统有多忙,可能还有其他小问题。您已经有了代码。为什么你要问我们,而不是自己运行并找到它?时间将完全相同(或接近),因为你正在等待每个线程在循环中完成…这段代码是否声称2是素数?它似乎只考虑奇数。它是否声称1是质数(似乎是)。如果
isPrime
计算
int(sqrt(n))
并在
i
超过该值时停止,它将运行得更快。如果它在特殊情况下i=2,3,那么它将运行得更快一些,然后只考虑
i=j*6+/-1
。我打赌我对iPrime的优化将击败你的线程优化(即使你运行的是octo核心处理器)。
#include "threads.h"

int main()
{
    callWritePrimesMultipleThreads(0, 1000, "primes.txt", 10);

    return 0;
}