我有一些函数可以检查给定范围内的素数,并将结果输出到文本文件。该函数还要求用户输入函数将使用的线程数。
#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;
}
这里是主要的:
#include "threads.h"
int main()
{
callWritePrimesMultipleThreads(0, 1000, "primes.txt", 10);
return 0;
}
我想知道,对于哪个值N
,线程数量,程序将运行得最好。
答案 0 :(得分:0)
这个问题的最佳解决方案是启动N个线程,每个线程运行相同的函数,增加共享计数器(使用InterlockedIncrement,用于线程安全),并计算它是否为素数。
如果这样做,并将N设置为机器中的核心数,您将获得最佳的100%CPU消耗,并且零上下文切换。
关于输出,请注意您无法在不锁定的情况下安全写入一个输出文件(您要避免)。相反,我会在数组或向量中收集素数(每个线程一个向量),最后将它们合并到一个向量中,对它们进行排序然后写入文件。