2015-09-04 48 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工具的經驗來看,我最初將敏感度設置爲最小值,因爲這些工具通常會報告很多錯誤。其中有些不是你的錯,而是你正在使用的庫。你想首先得到低垂果實。一旦你修正或抑制了重大錯誤,轉向不太嚴重的錯誤。沖洗&重複。

快速調試! :)