我最近开始使用线程,我试图运行一个使用线程的简单程序,但我得到了非常奇怪的输出。
程序将给定范围内的素数与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");
}
谢谢!
答案 0 :(得分:1)
调试时间结果是std :: ofstream的执行错误。只需在开头M*M.T
输出即可解决问题。编译器是MSVC 2015更新1.有关它的更多信息here。此外,您有资源泄漏,单个线程不是真正的意图,没有有效的算法在一个范围内查找素数,编译您发布的代码中的错误,不必要的writePrimesToFile函数和头文件中的头文件,你还有OP << "\n"
可能会出现更多问题。我建议您在codereview.stackexchange.com发布代码以使代码更好,因为解决此问题不足以解决原始问题。
编辑:每次写完文章时都需要刷新流。