У меня есть функция для временного получения кадра из камеры GigE и хочу, чтобы он быстро возвращался. Стандартная процедура такова:
// ...
camera.StartCapture();
Image img=camera.GetNextFrame();
camera.StopCapture(); // <-- takes a few secs
return img;
Возвращаемые данные готовы после GetNextFrame()
и StopCapture()
довольно медленны; поэтому я хотел бы как можно скорее вернуть img
и создать фоновый поток, чтобы сделать StopCapture()
. Однако в (маловероятном) случае повторного запуска приобретения я хотел бы защитить доступ мьютексом. Есть места, где могут быть сброшены исключения, поэтому я решил использовать блокировку в стиле RAII, которая будет выпущена при выходе из области действия. В то же время мне нужно перенести замок в фоновый поток. Что-то вроде этого (псевдокод):
class CamIface{
std::mutex mutex;
CameraHw camera;
public:
Image acquire(){
std::unique_lock<std::mutex> lock(mutex); // waits for cleanup after the previous call to finish
camera.StartCapture();
Image img=camera.GetNextFrame();
std::thread bg([&]{
camera.StopCapture(); // takes a long time
lock.release(); // release the lock here, somehow
});
bg.detach();
return img;
// do not destroy&release lock here, do it in the bg thread
};
};
Как я могу перенести блокировку от вызывающего на порожденный фоновый поток? Или есть лучший способ справиться с этим?
EDIT: Достаточное время жизни экземпляра CamIface
гарантировано, предположим, что оно существует навсегда.