我正在尝试解决以下问题:

有一个小程序正在尝试移植到调用函数 doWork() 的 OSX(intel)
通过 pthread_create,在函数中,我首先创建一个 long 数组,如下所示:

长数组[维度]

在 OSX 上,对于以下 DIMENSION 值,我得到以下信息:

0->65434 = 很好
65435->67037 = 信号总线
67037+ = SIGSEGV

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

这是来源:
#include pthread.h#include stdio.h#define NUM_THREADS 5#define DIMENSION 12345void *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);}

最佳答案

看起来你正在溢出堆栈。

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

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

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

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

关于c - OSX 上的总线错误 - pthreads,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3329379/

10-14 16:28