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.
Vous pouvez utiliser un outil comme 'valgrind' pour avoir plus d'informations sur ce qui se passe. –