私は、オペレーティング システム クラスの「スレッドプール」プログラムに取り組んでいます。基本的に、ファイルは 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用に作成されています)