生成者消费者模式,须在真正的生产者消费者线程中等待

1.生产者线程

while(1){

cvCornerFast();//角点检测

lkOutFrame * frame = new lkOutFrame();//生产一帧

myPyrlk.CaclOpticalFlowPyrLK(...,frame);//调用opencl函数计算光流

}

因为myPyrlk.CaclOpticalFlowPyrLK()中使用的是opencl的回调函数模式,frame的入队操作在回调函数中,所以只会在回调函数中等待。

回调函数属于另一个线程,那么真正的生产者线程并不会阻塞,一直在循环运行,因为速度太快导致生产的frame累积的越来越多,比如累积了1000帧,其实是有1000个回调函数队列在排队执行,同时也导致分配了1000帧的内存,内存需求量一直在剧增。

所以应该在真正的生产者线程中阻塞等待,这样内存便不会一直剧增:

myLkQueue.wait_nofFull();

lkOutFrame * frame = new lkOutFrame();//生产一帧

posted @ 2016-03-07 10:29  mlj318  阅读(213)  评论(0编辑  收藏  举报