[問題]以thread 作影像處理與成像的同步問題

作者: yushengc   2016-02-02 10:33:49
開發平台(Platform):
VC++
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
問題(Question):
最近在開發一個影像處理的演算法,將一個畫面的左右兩部份分別用各自的thread 來處
理, 但是在輸出影像的時候,有兩個主要的問題。
一個是左右畫面不同步的更新,代表display函數讀取影像記憶體的時候,兩個各自的
thread並沒有同時完成。這個有點想不通,因為在main()中,display函式是在影像處理
member function [proc_entro()]之後, 會有這個現象有點奇怪
一個是會發生左右兩邊呈現未處理的影像,而且是隨機發生的,
目前懷疑是記憶體的操作造成這個結果,但是還沒有什麼頭緒,
想請問版上高手們是否有什麼建議呢
其中thread的輸入與輸出都是完整的影像大小(包含左半面及右半面影像),因為成像演算
法左右兩邊是獨立的,所以用兩個thread分別計算
以下是目前的程式架構
main(){
proc* pproc;
//image_buffer 存放待處理影像的位址
//processed_image_buffer 存放處理完影像的位址
pproc->das_entro(image_buffer, processed_image_buffer);
display(processed_image_buffer);
}
proc.cpp
==============================
proc::das_entro(short* image_buffer, short* processed_image_buffer){
thread das_thd1(&proc::das_thd1, this, image_buffer, processed_image_buffer);
thread das_thd2(&proc::das_thd2, this, image_buffer, processed_image_buffer);
das_thd1.join();
das_thd2.join();
return 0;
}
proc::das_thd1(short* image_buffer, short* das_image_buffer){
...
//左半面影像處理
...
return 0;
}
proc::das_thd2(short* image_buffer, short* das_image_buffer){
...
//右半面影像處理
...
return 0;
}
餵入的資料(Input):
image buffer
預期的正確結果(Expected Output):
錯誤結果(Wrong Output):
程式碼(Code):(請善用置底文網頁, 記得排版)
補充說明(Supplement):
作者: Caesar08 (Caesar)   2016-02-02 11:37:00
只看thread是沒問題的,但你的das_thd1是否會重新newmemory給das_image_buffer呢?
作者: yushengc   2016-02-02 13:40:00
目前的寫法不會new一個buffer耶,而是在main這一層宣告好影像空間,再將空間位址傳入function
作者: Caesar08 (Caesar)   2016-02-02 14:00:00
如果不開thread呢?
作者: yushengc   2016-02-02 14:08:00
不開thread就沒有這個問題 因為想加速原本的演算法...
作者: Caesar08 (Caesar)   2016-02-02 15:58:00
話說你的das_thd1與das_thd2的das_image_buffer是指向同一個buffer,你能保證不會不會覆蓋到嗎?傳給thread只會copy pointer,而不是指到的memory
作者: yushengc   2016-02-03 10:55:00
是的,有確認兩個thread輸出給das_image_buffer沒有重覆
作者: justinj (黑旋風)   2016-02-03 11:37:00
如果是C我偶爾遇到 通常會加volatile...
作者: Caesar08 (Caesar)   2016-02-03 11:57:00

Links booklink

Contact Us: admin [ a t ] ucptt.com