OpenCV 分配导致 std::thread::join 中的段错误

Posted

技术标签:

【中文标题】OpenCV 分配导致 std::thread::join 中的段错误【英文标题】:OpenCV allocation causes segfault in std::thread::join 【发布时间】:2016-01-10 03:15:36 【问题描述】:

下面的代码在 std::thread 类的 .join() 中引发了分段错误。但是,只有我使用 cv::fastMalloc 分配数据数组时才会发生这种情况。如果我使用 'new' 关键字或 std::malloc 函数,则不会发生错误。

我需要了解为什么会发生此错误,因为实际上我需要一个使用此函数的 cv::Mat。

int main() 
    uchar* data = (uchar*) cv::fastMalloc(640);

    std::atomic<bool> running(true);
    std::thread thread([&] () 
        while(running) 
            // I'll perform some process with data here
            // for now, just to illustrate, I put thread to sleep
            std::this_thread::sleep_for(std::chrono::milliseconds(100));
        
    );
    std::this_thread::sleep_for(std::chrono::seconds(1));

    running = false;
    // segfault is thrown here
    thread.join();

    cv::fastFree(data);
    return 0;

GDB 调用栈如下所示

#0 00429B26 _pthread_cleanup_dest () (??:??)
#1 003E32A0 ?? () (??:??)

有人知道会发生什么吗?我真的觉得这太疯狂了:S。

谢谢。

【问题讨论】:

您使用的是哪个版本?你是如何编译/链接的?如果这一切都很好,看起来像一个明确的错误。 mingw32-g++.exe -std=c++11 -Wall -fexceptions -lm main.cpp -o main.o mingw32-g++.exe -o main.o -lopencv_core2410.dll.a MinGW 4.8.1 和 OpenCV 2.4.10 不知道 mingw,但通常当您使用 std::thread 时,您还需要链接 -lpthread 是的,我已经试过了,没有效果。我也尝试设置-pthreadcompiler 标志,但也没有用。 【参考方案1】:

我通过重新安装 opencv 解决了这个问题。显然问题是我编译了 opencv 并在这个例子中使用的不同版本的编译器。

为了记录,我前段时间用不支持 std::thread 的 MinGW 版本编译了 opencv(我认为是 4.7.x)。

【讨论】:

以上是关于OpenCV 分配导致 std::thread::join 中的段错误的主要内容,如果未能解决你的问题,请参考以下文章

std::thread 导致程序中止

据称 std::thread 导致不可用的堆栈跟踪

std::thread 导致应用程序中止并出现错误 R6010

带有类参数的 std::thread 初始化导致类对象被多次复制

std::thread,在线程中抛出异常会导致 Visual C++ 中的中止错误

复制`std :: thread :: spawn`会导致堆栈溢出