我的实现存在缺陷,我无法弄清楚。我有一个工作线程不一致地调用回调函数来写入名为“m_bufferLatest”的缓冲区。缓冲区需要被复制过来,并且需要一些时间才能在主线程中完成复制。所以我需要保护“m_bufferLatest”。因此,在我调用ContinuousCapture()的主线程中,我设置了一个名为“m_skipFrame”的标志,以便回调函数不会写入m_bufferLatest。如何保护使用多线程的缓冲区?
但是,当我运行我的程序时,m_bufferLatest为空,具体取决于工作线程运行的速度。
有人可以帮助我什么是我的程序错了吗?
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;
}
立即突出显示的一件事情是,m_skipframe在互斥锁被锁定时设置,但在互斥体外进行检查。 – SergeyA
另一件事 - 如果传输失败 - 标志仍然是真实的,所以不会再写入。你也在等待互斥锁下的EofCond。在这种情况下,你期望其他线程会做什么?我只会使用互斥锁来保护缓冲区并使标志原子化... –
@SergeyA我将m_skipFrame移到互斥量中,但它仍然无效。我得到无效的访问内存。我已经更新了代码。 – user1296153