【问题标题】:bad access in a simple multi-thread programm on MAC OS X YosemiteMAC OS X Yosemite 上的简单多线程程序中的错误访问
【发布时间】:2015-06-15 21:57:24
【问题描述】:

在单独的线程中转换大图像(超过 1Mb)时,ImageMagick 库崩溃。 我的简单测试程序也崩溃并显示相同的消息:

#include <thread>
void foo() 
{
    const int size = 0x7FCC9; //program crashes when size is equal or more than this value
    char buff[size];
    for(int i = 0; i < size; ++i)
    {
        buff[i] = i;
    }
}

int main(int argc, char *argv[])
{
    foo(); //passed!
    std::thread thr(foo);
    thr.join(); //got error :(
    return 0;
}

i == 58736 :)

线程2:EXC_BAD_ACCESS(代码=2,地址=0x103512000)

为什么我的简单代码会产生这个错误? 如何在 MAC OS 上增加线程的内存大小?

【问题讨论】:

  • 这段代码和 ImageMagick 有什么关系?它不包含任何 ImageMagick 标头或调用任何 ImageMagick 函数。
  • 没错。如果在单独的线程中启动 ImageMagick,它会在 ImageMagick 从大文件中读取所有内容时崩溃。我的简单程序创建缓冲区并对其进行迭代,就像我们读取和转换大文件一样。

标签: multithreading macos memory crash imagemagick


【解决方案1】:

主线程中的堆栈大小大于子线程中的堆栈大小,因此在主线程中您的缓冲区保持在堆栈大小内,但在子缓冲区中传递到外部并且您得到 Thread2: EXC_BAD_ACCESS (code=2, address = 0x103512000)

我建议你使用 boost 线程:

boost::thread::attributes attrs;
attrs.set_size(4096*10);
boost::thread myThread(attrs, fooFunction, 42);

http://www.boost.org/doc/libs/1_51_0/doc/html/thread/thread_management.html#thread.thread_management.tutorial.attributes

【讨论】:

    猜你喜欢
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多