2010-07-25 5 views
2

essaie d'obtenir ma tête autour des axes suivants:Erreur de bus sur OSX - pthreads

Avoir un petit programme essaie de port OSX (intel) dont la fonction appelle DoWork() via pthread_create, dans la fonction, Je commence par la création d'un tableau de longs comme par exemple:

 
long myarray[DIMENSION] 

sur Mac OS X, pour les valeurs suivantes de DIMENSION, j'obtiens ce qui suit:

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

Je suis totalement confus ici, je comprendre que SIGBUS est dû à des problèmes d'alignement de la mémoire en général, j'ai vérifié sizeof (long) et il semble être 8 sur cette plate-forme. Quelqu'un peut-il me diriger dans la bonne direction des documents que je devrais lire ici?

Voici la source:

 

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

Répondre

6

Il semblerait que vous êtes déborder la pile.

Vous devez convertir le tableau long en tableau de commande, ou utiliser pthread_attr_setstacksize et vos amis pour créer une pile plus grande lorsque vous appelez pthread_create.

Les tailles de pile de threads par défaut varient beaucoup avant les plates-formes, ce qui expliquerait pourquoi le code fonctionne sur d'autres plates-formes.

https://computing.llnl.gov/tutorials/pthreads/#Stack a un exemple de code. Pour savoir pourquoi vous obtenez un sigbus, c'est probablement parce que le fait de créer le tableau écrase une partie des structures de données internes de pthreads avec la faille, ce qui entraîne une erreur d'alignement lorsque pthreads essaie de nettoyer le thread.

+0

Merci, cela a du sens, en utilisant getstacksize() On me dit que le thread a 524288 octets de pile, en supposant que long est 8 octets, 8 * 62435 vient juste en dessous (523480), j'imagine le reste est frais généraux d'une certaine sorte? – lochii

+0

semble probable. Il y aura un bloc pthread en bas du thread et il y aura une petite surcharge de toutes les fonctions sur la callstack. – JosephH