[问题]以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