C ++单线程工作,在新线程上调用“abort()”

时间:2016-09-28 08:38:05

标签: c++ multithreading opencv

我遇到的问题很可能与线程或互斥有关:

当我直接在main方法中调用自定义方法时,它会起作用并产生结果。但是,计算需要大约900毫秒。所以我想创建一个只执行此计算的单个线程,然后显示结果。

此时项目非常大,我尝试给出与原始代码尽可能接近的伪代码。

更多背景信息:我从相机流式传输深度图像,并希望在此图像上使用细化算法。使用OpenCV 3.1.0和MSVC 2015(全32位)。

int main()
{
 //init camera, read images etc...
 Mat copyOfImage = dephtImage->clone();
 applyThreadedThinning(&copyOfImage);

 return 0;
}

此版本正常。 如果我这样称呼方法:

std::thread t1(&applyThreadedThinning,&copyOfImage);

它说 “调试错误!

节目:.... * .exe

abort()被称为

(按重试调试应用程序)“

我无法想象为什么它没有一个线程就可以工作,但是一个线程却没有。 调试有点复杂,我只是按“步入”跟随每一行,并等到它发出此错误消息。一旦我隔离了导致此错误的代码行,我该怎么办?

3 个答案:

答案 0 :(得分:1)

一个c ++ std :: thread对象需要知道它应该做什么,以防它被销毁(超出范围)。

有两个选项:detach等待线程完成或t1.join()从对象中分离线程。

因为两个选项都是有效的,所以决定在破坏std :: thread对象而不首先调用其中一个函数时,它们都不会隐含在破坏上并且抛出assert(abort)。 / p>

如果你想在对象超出范围之前等待线程完成调用t1.detach()

如果你想让自己脱离线程并让它在某些时候完成,你就不在乎在对象超出范围之前调用public interface IA<T> { void someMethod(T); } public interface IB<T> { T anotherMethod(); } class AImpl<T extends IB<SomeGenericTypeIWantToUse>> implements IA<T> { ISomeModule<SomeGenericTypeIWantToUse> module; public void someMethod(T param) { SomeGenericTypeIWantToUse myVariable = param.anotherMethod(); module.digest(myVariable); } } public interface ISomeModule<T> { void digest(T value); } public class SomeModuleImpl<T> implements ISomeModule<T> { public void digest(T value) { //...do something... } }

答案 1 :(得分:0)

您应该在主函数中等待,直到线程结束。

...
t1.join();
return 0;

答案 2 :(得分:0)

解决了abort()问题。这个问题似乎与范围/智能指针有关。只需用cv :: Mat(无指针)替换每个cv :: Mat *,并根据更改的类型调整代码。

对我来说这是一个解决方案。感谢@Hayt的解释,它确实加快了我的进程。