我尝试使用前后缓冲区和两个线程来编写录像机,这段代码可以工作,但是很难调试多线程代码,所以我不确定这段代码是否能100%正常工作我真的很感激,如果有人能看到这个并检查我是否遗漏了任何东西。
基本理念是, 编码线程正在等待前缓冲区 在这个时间记录线程正在填充缓冲区,当它完成时,它会切换缓冲区。 编码线程编码前缓冲区,记录缓冲区再次填充后台缓冲区。
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,编码线程应该锁定前缓冲但记录线程在编码线程之前会再次填充backbuffer并锁定前缓冲区的可能性很小。在这种情况下,我会失去一个框架,我不确定我是否应该打扰这个。
答案 0 :(得分:0)
我建议你使用自己喜欢的测试框架为它编写一些单元测试,然后在helgrind中运行测试。它是检测同步错误的工具,它是valgrind的一部分:http://valgrind.org/docs/manual/hg-manual.html。
根据我对valgrind工具的个人经验,我最初将灵敏度设置为最小值,因为这些工具通常会报告很多错误。其中一些不是你的错,而是你正在使用的库。你想先得到低悬的果实。一旦你修复或压制了重大错误,就转移到不太严重的错误。冲洗&重复。
快乐的调试! :)