私の実装に欠陥があり、わかりません。私は一貫してコールバックを呼び出して、 "m_bufferLatest"という名前のバッファに書き込むワーカースレッドを持っています。バッファをコピーする必要があり、メインスレッドでのコピーを完了するまでに時間がかかります。だから私は "m_bufferLatest"を保護する必要があります。したがって、メインスレッドでContinuousCapture()を呼び出すと、コールバックがm_bufferLatestに書き込まれないように、「m_skipFrame」というフラグを設定します。複数のスレッドを使用するバッファの保護方法を教えてください。
私のプログラムを実行すると、m_bufferLatestはワーカースレッドの実行速度に応じてnullになります。
誰かが私のプログラムに間違っていることを教えてもらえますか?
bool HandleEofCallbackCont()
{
std::lock_guard<std::mutex> lock(m_EofMutex);
if (!m_skipFrame) {
//here update m_bufferCont
if (!m_camera->SaveLatestFrameToQueue())
{
printf("get latest frame failed.. \n");
}
}
m_EofFlag = true;
}
m_EofCond.notify_one();
return true;
}
bool ContinuousCapture(Settings settings)
{
//wait for the condition variable otherwise timeout
std::unique_lock<std::mutex> lock(m_EofMutex);
{
if (!m_EofFlag)
{
m_EofCond.wait_for(lock, std::chrono::seconds(10), [&]() {
return (m_EofFlag);
});
}
m_skipFrame = true;
int size = m_camera->m_bufferBytes/sizeof(uns16);
//transfer from data
if (!TransferData(settings, (uns16*)m_camera->m_bufferLatest, size, m_Frame))
{
printf("transfer data failed");
return false;
}
m_skipFrame = false;
m_EofFlag = false;
}
return true;
}
これは私がやろうとしていることです。
すぐに出ることの1つは、mutexがロックされているときにm_skipframeが設定されていて、mutexの外側でチェックされていることです。 – SergeyA
もう一つは、転送が失敗した場合でも、フラグはまだtrueです。これ以上の書き込みは行われません。また、mutexロックの下でEofCondを待っています。この場合、他のスレッドが何をすると思いますか?バッファを保護し、フラグをアトミックにするためにのみ、ミューテックスを使用します。 –
@SergeyA m_skipFrameをミューテックス内に移動しましたが、それでも動作しません。私は無効なアクセスメモリを取得します。私はコードを更新しました。 – user1296153