我正在为操作系统类开发一个“threadpool”程序。实质上,文件是从tar文件中提取的,并使用5个线程的池写入磁盘。这是我的线程代码
#include <iostream>
#include <cstdlib>
using namespace std;
vector<Header*> headers;
vector<string> fileBlocks;
void* writeExtractedFiles(void* args)
{
bool hasFilesLeft = true;
ofstream outputFile;
while(hasFilesLeft)
{
pthread_mutex_lock(&mutex);
if(headers.size() != 0)
{
Header* hdr = headers.back();
headers.pop_back();
string fileBytes = fileBlocks.back();
fileBlocks.pop_back();
pthread_mutex_unlock(&mutex);
outputFile.open(hdr->fileName.c_str(), ios::app);
outputFile.rdbuf()->pubsetbuf(0,0);
fileBytes = fileBytes.substr(0, hdr->fileSize);
outputFile.put('0');
outputFile.close();
// This is a dummy object to check if the values are corrupted
Header* test0 = headers.back();
cout << "GRAWWR!";
//chown(hdr->fileName.c_str(), hdr->userId, hdr->groupId);
//chmod(hdr->fileName.c_str(), hdr->fileMode);
}
else
{
// We're done!
hasFilesLeft = false;
pthread_mutex_unlock(&mutex);
}
}
}
注意截至目前,我只用一个线程测试它。显然,在我的互斥锁之外访问headers
向量会对多线程产生反作用。
问题是,test0
的值都是混乱的,超高数字和fileName
的无意义。看起来我出于某种原因覆盖了我的堆栈变量。当我注释掉outputFile.close();
时,我的变量值没有改变,但是当我保留它时,无论我是否真的将文件写入文件,事情都会变得很糟糕。我知道必须有一些我不知道的东西。我已经尝试完全摆脱缓冲区,将文件写在不同的地方,我能想到的任何东西。有什么建议吗?
(我在Windows机器上测试它,但它是为Linux制作的)