ofstream覆盖堆栈变量

时间:2013-03-25 05:54:13

标签: c++ netbeans g++

我正在为操作系统类开发一个“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制作的)

0 个答案:

没有答案