2010-05-12 6 views
0

Je construis un programme en C++, en utilisant SDL et reçois des temps en temps cette erreur:erreur multithread SDL en C++

* glibc détecté * ./assistant: à double libre ou la corruption (! Prev)

Il est difficile de répliquer, donc je ne peux pas trouver exactement ce qui le cause, mais j'ai juste ajouté un deuxième thread au programme, et aucun thread exécuté seul ne semble causer l'erreur.

Les threads ne partagent aucune variable, bien qu'ils exécutent tous les deux les fonctions SDL_BlitSurface et SDL_Flip. Est-ce que courir en même temps jette une telle erreur, ou est-ce que j'aboie le mauvais arbre?

Si c'est la cause, devrais-je simplement jeter un mutex autour de tous les appels SDL?

Merci

+1

Les deux fonctions prennent un paramètre 'SDL_Surface *'. Passez-vous la même surface à chaque fonction? –

+0

En fait, vous avez raison, je le fais. Toutes les mêmes surfaces, en fait: les deux threads appellent une fonction de tirage général. Cela causerait-il l'erreur que j'ai mentionnée? Je ne suis pas familier avec cela, bien que lors de la recherche d'une réponse, il a semblé être suggéré que l'erreur a été lancée quand on a essayé d'allouer la mémoire qui était déjà non allouée. – wyatt

Répondre

0

Il s'avère qu'il était dû au fait que les filetages ne se terminaient pas correctement. Au lieu de les terminer à partir de main, je leur ai permis de revenir quand ils ont vu que le principal avait fini de fonctionner (grâce à une variable globale 'running'), et le problème a disparu.

+0

La solution n'est probablement pas celle-ci, mais comment vous terminiez les threads dans le code que vous avez supprimé. –

1

vous sont en cours d'exécution avec la variable d'environnement MALLOC_CHECK_? Cela active les vérifications de la mémoire dans la glibc, et j'ai déjà eu des problèmes à cause d'une condition de concurrence dans le code de contrôle de la mémoire de la glibc (http://sourceware.org/bugzilla/show_bug.cgi?id=10282) qui l'a fait sortir des messages de ce genre faussement. Essayez de courir sous valgrind et voir si cela voit des problèmes.