Problème thread sous mac

loic199

Membre enregistré
8 Avril 2009
4
0
Bonjour,


Je suis entrain de réaliser un programme en C utilisant des threads. Tout marchait bien sous linux mais le programme bug sous mac. Je soupçonne fortement les threads. Quelqu'un aurait-il connaissance d'une quelconque différence d'utilisation des threads entre linux et mac?

Merci d'avance
 
Sous mac OSX, il faut utiliser les threads POSIX (librairie pthread) ou leur encapsulation dans Cocoa.
 
du code... give du code, symptoms

pour la difference fait une recherche dans le forum

J'ai cherché mais rien trouvé.


Voila du code:

Bloc de code:
int main(int argc, char *argv[]){
 
  pthread_t threadjeu;
  SDL_Event event;
  void *ret;

  if (SDL_Init(SDL_INIT_VIDEO) == -1) // Démarrage de la SDL.
    {
      fprintf(stderr, "Erreur d'initialisation de la SDL : %s\n", SDL_GetError()); // Ecriture de l'erreur
      exit(EXIT_FAILURE); // On quitte le programme
    }

  SDL_Init(SDL_INIT_VIDEO);
 
  ecran = SDL_SetVideoMode(1000, 700, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); // Double Buffering
  SDL_WM_SetCaption("Projet JetLiner", NULL);
  SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));


  initialisationfond(ecran);


  while (quitter)
    {
      SDL_WaitEvent(&event); // Attente d'un évènement au clavier
      switch(event.type)
        {
    case SDL_QUIT:
      quitter = 0;
      SDL_Quit();
      break;
    case SDL_KEYDOWN:
      switch(event.key.keysym.sym)
        {

        case SDLK_RETURN:
          
          if(pthread_create(&threadjeu, NULL, jeu, NULL) < 0) // Création du thread
        {
          fprintf(stderr, "Erreur de création du thread threadjeu\n"); // Ecriture de l'erreur
          exit(1); // On quitte le programme
        }

          (void)pthread_join(threadjeu,&ret);
          perdu=1;
          initialisationfond(ecran);
          break;

        case SDLK_q:
          SDL_Quit();
          quitter=0;
          break;

        default:
          break;
        }
      break;
        }
    }

  return EXIT_SUCCESS;

}
 
#define _MULTI_THREADED
#include <pthread.h>

pthread_mutex_t thread_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_t thread_id[5];

static void *my_handler(void *arg) { return arg;}

pthread_mutex_lock(&thread_mutex);
pthread_create(&thread_id[1], NULL, my_handler, &thread_id[1])) ;

pthread_detach(&thread_id[1]);
pthread_mutex_unlock(&thread_mutex);
pthread_mutex_destroy(&thread_mutex);

http://code.google.com/p/le-depotoir/source/browse/trunk/user-set/do_schedyield.c


mais somme toute meme sans lock quel est le bug? quel est ton probleme, ca peut venir de SDL comme un tas de chose puisque tu n'es pas foutu d'exprimer le probleme symptoms
 
Je ne pense pas que cela vienne de la SDL car la 1ere version de programme qui n'a pas de thread tourne bien. Le problème est que lorsque j'exécute, le programme ne répond plus. J'ai mis des breakpoint et ça semble planté au niveau du thread.
 
que fait dans jeu? as tu essaye de faire reference a un handler vide? de plus au join ou au create ?

Bloc de code:
[B]#define _MULTI_THREADED
#include <pthread.h>[/B]

#define TRACE(fmt,args...) fprintf(stderr,fmt,## args)

#define CHECKTHIS(S,V) \
({ \
    if (V) { \
           TRACE("Failed with %d at %s:%i - %s\n", V, S, __LINE__, strerror(errno)); \
     } \
})

ret = pthread_create(&threadjeu, ....

CHECKTHIS("pthread_create\n", [B]ret[/B]);

ret = pthread_join(threadjeu,NULL); // -> remove cette cast a void sur un int ... 

CHECKTHIS("pthread_join\n", [B]ret[/B]);
a mon avis le thread se cree bien et ca plante dans le handler_jeu, d'ou non reponse, et c'est pour cela que le debugger s'arrete a thread parce qu' il est blind sur ce qui se passe a l'interieur