当前位置:  开发笔记 > 编程语言 > 正文

OSX上的总线错误 - pthreads

如何解决《OSX上的总线错误-pthreads》经验,为你挑选了1个好方法。

我试图了解以下内容:

有一个小程序我试图移植到OSX(intel)通过pthread_create调用函数doWork(),在函数中,我首先创建一个像这样的长数组:

long myarray[DIMENSION]

在OSX上,对于以下DIMENSION值,我得到以下内容:

0->65434 = fine
65435->67037 = SIGBUS
67037+ = SIGSEGV

我在这里完全感到困惑,我知道SIGBUS通常是由于内存对齐问题,我检查了sizeof(long),在这个平台上看起来似乎是8.有人能指出我应该在这里阅读的文档的正确方向吗?

这是来源:


#include pthread.h
#include stdio.h
#define NUM_THREADS     5
#define DIMENSION       12345

void *doStuff(void *threadid)
{
   long array[DIMENSION];
   pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long t;
   for(t=0; t lt NUM_THREADS; t++){
      printf("In main: creating thread %ld\n", t);
      rc = pthread_create(&threads[t], NULL, doStuff, (void *)t);
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
      }
   }
   pthread_exit(NULL);
}

JosephH.. 6

看起来你堆满了.

您需要将长数组转换为malloced数组,或者在调用pthread_create时使用pthread_attr_setstacksize和friends创建更大的堆栈.

默认的线程堆栈大小在平台之前变化很大,这可以解释为什么代码在其他平台上工作.

https://computing.llnl.gov/tutorials/pthreads/#Stack有一些示例代码.

至于为什么你得到一个sigbus,可能是因为创建数组的行为是用垃圾覆盖pthreads内部数据结构的某些部分,当pthreads试图清理线程时导致对齐错误.



1> JosephH..:

看起来你堆满了.

您需要将长数组转换为malloced数组,或者在调用pthread_create时使用pthread_attr_setstacksize和friends创建更大的堆栈.

默认的线程堆栈大小在平台之前变化很大,这可以解释为什么代码在其他平台上工作.

https://computing.llnl.gov/tutorials/pthreads/#Stack有一些示例代码.

至于为什么你得到一个sigbus,可能是因为创建数组的行为是用垃圾覆盖pthreads内部数据结构的某些部分,当pthreads试图清理线程时导致对齐错误.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有