У меня две нити; один вызывает Push(), а другой - Pop(). У меня проблема в том, что когда Push() вызывается с высокой скоростью (скажем, 100 кадров в секунду), Pop() не успевает за скоростью, и программа вылетает. При более низкой частоте кадров (скажем, 10 кадров в секунду) проблем нет. Могу ли я что-нибудь сделать, чтобы оптимизировать этот фрагмент кода?
void AcqCache::Push(FrameData& frameData)
{
// If cache not idle - wait
Monitor::Enter(m_cacheLock);
try
{
m_frameInfoBuffer[(frameData.GetFrameInfo().FrameNr - 1) % m_acqBuffer->BufferSize] = frameData;
// Unlock processing thread
m_frameDataCache->Push(frameData);
Monitor::Pulse(m_cacheLock);
}
finally
{
Monitor::Exit(m_cacheLock);
}
}
void AcqCache::Pop()
{
FrameData frData;
while (m_processFrameRunning)
{
// If cache not idle - wait
Monitor::Enter(m_cacheLock);
try
{
Monitor::Wait(m_cacheLock);
while (!m_frameDataCache->IsEmpty())
{
if (!m_processFrameRunning)
break;
frData = std::move(m_frameDataCache->Pop());
m_acqBuffer->CacheUsage = (int)m_frameDataCache->Count();
// Add frame to frame stack
m_acqBuffer->AddFrame(frData);
}
}
finally
{
Monitor::Exit(m_cacheLock);
}
}
}
Спасибо!
Что делают Monitor:: Wait / Enter / Pulse / Exit?





Это похоже на логическую ошибку, а не на проблему оптимизации.