2010-07-25 37 views
2

我试图让我的头围绕以下几个:总线错误 - 并行线程

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

 
long myarray[DIMENSION] 

在OSX,为维度的下列值,我得到如下:

 
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); 
} 
 

回答

6

这样看来你溢出堆栈。

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

默认线程堆栈大小在平台之前有很大差异,这可以解释为什么代码可以在其他平台上工作。

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

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

+0

谢谢,这是有道理的,使用getstacksize()我被告知,该线程有524288字节的堆栈,假设长是8字节,8 * 62435来就在那之下(523480),我会想象其余是某种形式的开销?听起来可能是 – lochii 2010-07-25 14:02:00

+0

。线程底部会有一个pthread块,并且callstack上的任何函数都会有小的开销。 – JosephH 2010-07-25 14:48:15