使用多线程计算素数

时间:2016-01-31 16:25:14

标签: c++

我最近开始使用线程,我试图运行一个使用线程的简单程序,但我得到了非常奇怪的输出。 程序将给定范围内的素数与N(函数参数)线程数写入文件“PRIMES.txt”,如果range <= 1000输出正常,但如果范围较大,则输出类似于:

‰‱′″‵‷ㄱㄠ″㜱ㄠ‹㌲㈠‹ㄳ㌠‷ㄴ㐠″㜴㔠″㤵㘠‱㜶㜠‱㌷㜠‹㌸㠠‹㜹ㄠ㄰ㄠ㌰ㄠ㜰ㄠ㤰ㄠ㌱ㄠ㜲ㄠㄳㄠ㜳ㄠ㤳ㄠ㤴ㄠㄵㄠ㜵ㄠ㌶ㄠ㜶ㄠ㌷ㄠ㤷... (much longer)

会出现什么问题?

这是我的代码:

threads.h:

#include <fstream>
#include <string>
#include <iostream>
#include <thread>
using namespace std;

void writePrimesToFile(int begin, int end, ofstream& file);
void callWritePrimesMultipleThreads(int begin, int end, string filePath, int N);

threads.cpp:

#include "Threads.h"
#include <iostream>
#include <string>
#include <fstream>
#include <thread>
#include <mutex>
#include <vector>

mutex mtx;

void PrimesToFile(int begin, int end, ofstream& file)
{
bool isPrime;
string Primes;
int count = 0;
mtx.lock();
cout << "Thread is running" << endl;
    for (int i = begin; i < end; i++)
    {
        isPrime = true;
        for (int j = 2; j < i; j++)
        {
            if (i%j == 0)
                isPrime = false;
        }
        if (isPrime)
        {
            Primes.append(to_string(i));
            Primes.append(" ");
        }
    }
file.write(Primes.c_str(), Primes.length());
mtx.unlock();
}

void WritePrimesMultipleThreads(int begin, int end, string filePath, int N)
{
    ofstream OP;
    OP.open(filePath);
    int lastPos = 0;
    int destPos = end / N;
    thread* TV = new thread[N];
    for (int i = 0; i < N; i++)
    {
        TV[i] = thread(PrimesToFile, lastPos, destPos, ref(OP));
        lastPos = destPos;
        destPos += end / N;
    }
    for (int i = 0; i < N; i++)
        TV[i].join();
}

起点:

#include "Threads.h"
#include <iostream>
#include <string>
#include <fstream>
#include <thread>

void main()
{
    WritePrimesMultipleThreads(1, 10000, "PRIMES.txt", 5);
    system("PAUSE");
}

谢谢!

1 个答案:

答案 0 :(得分:1)

调试时间结果是std :: ofstream的执行错误。只需在开头M*M.T输出即可解决问题。编译器是MSVC 2015更新1.有关它的更多信息here。此外,您有资源泄漏,单个线程不是真正的意图,没有有效的算法在一个范围内查找素数,编译您发布的代码中的错误,不必要的writePrimesToFile函数和头文件中的头文件,你还有OP << "\n"可能会出现更多问题。我建议您在codereview.stackexchange.com发布代码以使代码更好,因为解决此问题不足以解决原始问题。 编辑:每次写完文章时都需要刷新流。