我想写视频录像机使用正面和背面缓冲区和两个线程,此代码的作品,但它真的很难调试多线程代码,所以我不知道这段代码将工作100 %的时候,我真的很感激,如果有人可以看看这个,并检查我是否没有遗漏任何东西。使用交换缓冲区与升压conditional_variable
基本思路是, 编码线程在等待这个时间记录线程frontbuffer 被回填缓冲,当它完成,它切换缓冲区。 编码线程编码前端缓冲区,记录缓冲区再次填充后端缓冲区。
boost::mutex frontbuflock_;
boost::condition_variable ready_cond_;
raw_buffer_t raw_buf[2];
raw_buffer_t* raw_back_buffer_ = 0;
raw_buffer_t* raw_front_buffer_ = 0;
boost::atomic_bool front_buffer_ready_;
void record_thread()
{
do
{
int32_t* p = &raw_back_buffer_->at(0);
[[[ fill backbuffer with image data here ]]]
frontbuflock_.lock();
//swap buffers
raw_buffer_t* tmp = raw_front_buffer_;
raw_front_buffer_ = raw_back_buffer_;
raw_back_buffer_ = tmp;
front_buffer_ready_ = 1;
ready_cond_.notify_one();
frontbuflock_.unlock();
}while(!stop_);
}
void encode_thread()
{
do
{
while(!front_buffer_ready_)
ready_cond_.wait(lock);
frontbuflock_.lock();
[[[ encode frontbuffer here ]]]
front_buffer_ready_ = 0;
frontbuflock_.unlock();
}while(!stop_);
}
香港专业教育学院发现了一个小东西,可以说记录线程通知条件变量,并释放frontbuflock,编码线程应该锁定frontbuffer但那里有小的可能性是记录线程将填补后备缓冲和再次锁定frontbuffer之前编码线程将其锁定。在这种情况下,失去了一帧,我不知道我是否应该甚至打扰这一点。
乍一看,你似乎正在使用更多的锁定比你必须。 – JimmyB
你做了太多的锁定。此外,对于多线程使用的简单数据(如布尔标志),请使用原子而不是锁。比较交换(正确使用)可以很好地提高代码的速度。 –