Me référant à ma précédente question sur GDB not pinpointing the SIGSEGV point,Stack possible la corruption
Mon code de fil est la suivante:
void *runner(void *unused)
{
do
{
sem_wait(&x);
...
if(/*condition 1 check*/)
{
sem_post(&x);
sleep(5);
sem_wait(&x);
if(/*repeat condition 1 check; after atleast 5 seconds*/)
{
printf("LEAVING...\n");
sem_post(&x);
// putting exit(0); here resolves the dilemma
return(NULL);
}
}
sem_post(&x);
}while(1);
}
Code principal:
sem_t x;
int main(void)
{
sem_init(&x,0,1);
...
pthread_t thrId;
pthread_create(&thrId,NULL,runner,NULL);
...
pthread_join(thrId,NULL);
return(0);
}
Edit: Avoir une sortie (0) dans le code du thread du coureur, fait disparaître le défaut.
Quelles pourraient être les raisons de la corruption de la pile?
GDB sortie: (0xb7fe2b70 est id de fil de canal de coulée)
LEAVING...
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb7fe2b70 (LWP 2604)]
0x00000011 in ??()
Valgrind sortie:
==3076== Thread 2:
==3076== Jump to the invalid address stated on the next line
==3076== at 0x11: ???
==3076== by 0xA26CCD: clone (clone.S:133)
==3076== Address 0x11 is not stack'd, malloc'd or (recently) free'd
==3076==
==3076==
==3076== Process terminating with default action of signal 11 (SIGSEGV)
==3076== Bad permissions for mapped region at address 0x11
==3076== at 0x11: ???
==3076== by 0xA26CCD: clone (clone.S:133)
==3076== Address 0x11 is not stack'd, malloc'd or (recently) free'd
Vous devez poster plus de code. Toutes les parties juteuses sont manquantes. – EboMike
Est-ce la seule et unique erreur de rapports de valgrind? Si cela rapporte d'autres, commencez par le premier. – nos
Oui, c'est le seul. –