我想寫視頻錄像機使用正面和背面緩衝區和兩個線程,此代碼的作品,但它真的很難調試多線程代碼,所以我不知道這段代碼將工作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
你做了太多的鎖定。此外,對於多線程使用的簡單數據(如布爾標誌),請使用原子而不是鎖。比較交換(正確使用)可以很好地提高代碼的速度。 –