2013-09-26 2 views
0

J'avais écrit une sorte de bibliothèque multi-threading de base. Donc, pour chaque thread, je voudrais un contexte (ucontext_t). Dans l'un de mes programmes de test, j'ai mis une assertion qui a échoué. Au lieu d'abandonner avec un numéro de ligne, il a lancé une erreur de segmentation. J'ai ensuite vérifié et vu la taille de la pile de mon contexte était 8192. Quand je l'ai augmenté à 16394, l'échec de l'assertion a fonctionné comme prévu.Affirmer la faute de segmentation des appels

Quelqu'un peut-il me dire comment fonctionne l'affirmation interne et pourquoi utiliser autant d'octets? Je crois que 8192 est une assez grande taille pour mon contexte.

Voici comment mon fils est créé

MyThread *temp; 
temp=malloc(sizeof(MyThread_t)); 
ucontext_t tempContext; 
if (getcontext(&tempContext) == -1) 
    temp->ThreadId = 0; 
tempContext.uc_stack.ss_sp = (char *)malloc(SIZE_STACK*sizeof(char));; 
tempContext.uc_stack.ss_size = SIZE_STACK*sizeof(char); 
tempContext.uc_link = NULL; 
makecontext(&tempContext,(void(*)(void))start_funct,1, args); 

Et ma fonction de test, il a de cette façon.

T = MyThreadCreate(t0, (void *)n2); 
re=MyThreadJoin(T); 
printf("%d\n",re); 
assert(re==-1); 

valeur re est 0. Quand mon SIZE_STACK est 8192, je reçois une erreur de SEG. Quand il est passé à 16384, il s'agit d'un abandon approprié, comme attendu de l'affirmer.

+0

Vous pouvez utiliser un outil comme 'valgrind' pour avoir plus d'informations sur ce qui se passe. –

Répondre

1

L'implémentation de assert dépend de la plate-forme.

+0

Une idée de pourquoi il aurait besoin d'un si grand espace? Dans mon cas, mon thread ne contient que quelques variables. Donc, je crois que la pile est la plupart du temps vide. – Torpedo

+0

Quel compilateur/OS utilisez-vous? –

+0

gcc. En cours d'exécution sur Ubuntu 13.04 qui s'exécute sur une boîte virtuelle sur Win 8. – Torpedo

Questions connexes