我有一个c ++ - cli代码,它使用捕获从opencv文件夹中捕获视频,然后使用cvquery框架检索帧。然后我处理帧,一旦处理完所有帧,我就会释放捕获。它工作正常,但当我尝试多线程时,它给了我一个警告,无法捕获文件夹中的一些视频,警告“avcodec_open / close()周围的线程锁定不足”。
//for each video in folder do
{
capture=cvCreateFileCapture(filename);
while(1)
{
img=cvqueryframe(capture)
if !img break;
///process img
}
cvreleasecapture(&capture);
}
有没有办法解决多线程的问题?我在考虑使用
while(!capture)
capture=cvCreateFileCapture(filename);
但应该有一种更有效的方法,可能使用锁定Monitor :: Enter(obj)或lock(obj)?
答案 0 :(得分:10)
avcodec中的open
和close
函数不是线程安全的。为了防止多线程应用程序中出现问题,他们有一个简单的机制,可以检测两个线程何时同时进入这些函数,并在发生这种情况时编写“线程锁定不足”消息。
阻止此邮件的方法是锁定对cvCreateFileCapture
和cvreleasecapture
(进而调用avcodec_open
和avcodec_close
)的来电,以确保这些来电始终序列化。例如,如果你有一个名为Mutex的互斥类,你可以这样做:
extern Mutex m; // application-wide mutex
//for each video in folder do
{
m.lock();
capture=cvCreateFileCapture(filename);
m.unlock();
while(1)
{
img=cvqueryframe(capture)
if !img break;
///process img
}
m.lock();
cvreleasecapture(&capture);
m.unlock();
}
有许多Mutex实现。在Linux或OS X上,您可以使用pthread mutexes。在Windows上,您可以使用Win32 mutexes。