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