0

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

4

0 回答 0