キューを持つスレッドを作成し、メイン処理側で作成したデータを
スレッドのキューに追加して、スレッド側のキューから順次CSVファイルに
出力する処理を作成しております。
CSVファイルへの出力自体はできたのですが、下記main関数内のfor文の繰り返し件数を増やすと
途中で「deque iterator not dereferencable」という例外が発生し、それ以上出力できなくなります。
調べてみると、キューが空の場合にpopを行うと発生するらしいのですが、
事前にempty() == false の場合にしか処理をしていないのに、なぜ起きるのか分かりません。
(frontやpopの部分にtry catchを入れてみましたが、例外を検出できませんでした。)
以下に要約したコードを記しますので、誤り等ありましたらご指摘頂ければ幸いです。
よろしくお願いします。
//////////////////////////////////////////////////////////////////////////////
// メイン側
//////////////////////////////////////////////////////////////////////////////
Thread *CsvOutThread;
int main()
{
// スレッドの生成と起動
makeThread();
for (int i = 0; i < 20000; i++)
{
// データ生成
RECORD_T *pRecord;
memset(pRecord, 0, sizeof(RECORD_T));
// ここでpRecord編集
// ここにデータ格納処理を入れる
CsvOutThread->EnQueData(pRecord);
}
return 0;
}
//////////////////////////////////////////////////////////////////////////////
// スレッド側
//////////////////////////////////////////////////////////////////////////////
queue<RECORD_T *> DataQ;
int Thread::thmain()
{
// スレッドメインループ
while (m_blLoopFlg)
{
OutputData();
}
return 0;
}
//////////////////////////////////////////////////////////////////////////////
// データのキュー追加処理
//////////////////////////////////////////////////////////////////////////////
void Thread::EnQueData(RECORD_T *pRecord)
{
// データをキューに追加する
DataQ.push(pRecord);
}
//////////////////////////////////////////////////////////////////////////////
// データ出力
//////////////////////////////////////////////////////////////////////////////
void Thread::OutputData()
{
if (DataQ.empty() == false)
{
RECORD_T* Record;
// データをキューから出す
Record = DataQ.front();
// 編集してCSV出力する
// 出力したデータをキューから削除
DataQ.pop();
}
}