我正在为操作系统类开发一个“线程池”程序。本质上,文件是从 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 制作的)