生成者消费者模式,须在真正的生产者消费者线程中等待
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();//生产一帧