我试图了解以下内容:
有一个小程序我试图移植到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试图清理线程时导致对齐错误.
看起来你堆满了.
您需要将长数组转换为malloced数组,或者在调用pthread_create时使用pthread_attr_setstacksize和friends创建更大的堆栈.
默认的线程堆栈大小在平台之前变化很大,这可以解释为什么代码在其他平台上工作.
https://computing.llnl.gov/tutorials/pthreads/#Stack有一些示例代码.
至于为什么你得到一个sigbus,可能是因为创建数组的行为是用垃圾覆盖pthreads内部数据结构的某些部分,当pthreads试图清理线程时导致对齐错误.