2015-09-04 51 views
0

我想写视频录像机使用正面和背面缓冲区和两个线程,此代码的作品,但它真的很难调试多线程代码,所以我不知道这段代码将工作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之前编码线程将其锁定。在这种情况下,失去了一帧,我不知道我是否应该甚至打扰这一点。

+0

乍一看,你似乎正在使用更多的锁定比你必须。 – JimmyB

+0

你做了太多的锁定。此外,对于多线程使用的简单数据(如布尔标志),请使用原子而不是锁。比较交换(正确使用)可以很好地提高代码的速度。 –

回答

0

我建议你使用你最喜欢的测试框架为它编写几个单元测试,然后在helgrind中运行测试。它是检测同步错误的工具,它是valgrind的一部分:http://valgrind.org/docs/manual/hg-manual.html

从我个人使用valgrind工具的经验来看,我最初将敏感度设置为最小值,因为这些工具通常会报告很多错误。其中有些不是你的错,而是你正在使用的库。你想首先得到低垂果实。一旦你修正或抑制了重大错误,转向不太严重的错误。冲洗&重复。

快速调试! :)