2010-07-25 5 views
2

는 다음 주위에 내 머리를 얻으려고 노력하고 있어요 나는 그런처럼 긴 배열을 생성하여 시작합니다버스 오류의 pthreads

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

내가 여기 완전히 혼란 스러워요 :

OSX에
 
long myarray[DIMENSION] 

이 DIMENSION 다음과 같은 값을, 나는 다음과 같은 얻을 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

그것은 당신이 스택 오버 플로우를하고 나타납니다 : 여기

는 소스입니다.

pthread_create를 호출 할 때 긴 배열을 malloced 배열로 바꾸거나 pthread_attr_setstacksize 및 friends를 사용하여 더 큰 스택을 만들어야합니다.

플랫폼 전에 기본 스레드 스택 크기가 매우 다양하여 다른 플랫폼에서 코드가 작동하는 이유를 설명합니다.

에는 몇 가지 예제 코드가 있습니다.

sigbus를 얻는 이유는 pthreads가 쓰레기로 내부 데이터 구조의 일부를 덮어 쓰고 pthread가 스레드 정리를 시도 할 때 정렬 오류가 발생하기 때문입니다.

+0

감사합니다. getstacksize()를 사용하면 스레드에 524288 바이트의 스택이 있다고 가정합니다. 길이는 8 바이트라고 가정하고 8 * 62435는 그 바로 아래 (523480)에옵니다. 나머지는 상상할 것입니다. 어떤 종류의 간접비인가? – lochii

+0

소리가 들립니다. 스레드의 맨 아래에 pthread 블록이있을 것이고 콜 스택의 모든 함수에서 작은 오버 헤드가있을 것입니다. – JosephH