Partage
  • Partager sur Facebook
  • Partager sur Twitter

mutexes et bizzarerie

serveur multi thread

    2 septembre 2007 à 23:22:24

    Bonjour,

    Je concois un serveur multi thread pour mon mmo mais il m'arrive que j'ai des problemes avec mes mutexes.
    Est ce que les mutexes mette en pause l'execution tant que le mutex n'est pas debloqquer ou passe t-il a la phase suivante (apres le unlock).

    De plus la chose etrange dans mon code est que quand j'enleve cout << "lu" << endl;
    ou autre chose dans le cout, le serveur ne marche pas !

    Voila le code de test :

    Il me semble que l'execution se poursuit.

    1. #include "collision.h"
    2. #include "serveur.h"
    3. #include "ILogger.h"
    4. #include <iostream>
    5. #include <windows.h>
    6. #include <list>
    7. #include <functional>
    8. #include "include/pthread.h"
    9. typedef struct PL{
    10.     char PX[12],PY[12],PZ[12],RY[12],action[5];
    11.     int id;
    12. };
    13. using namespace std;
    14. pthread_mutex_t job_queue_mutex = PTHREAD_MUTEX_INITIALIZER;
    15. int id = 0;
    16. PL mystruct[5000];
    17. void player::game(MySQL Msql)
    18. {
    19.     int myID = id;
    20.     char buffer[1024], old[1024];
    21.     pthread_mutex_lock (&job_queue_mutex);
    22.     id++;
    23.     pthread_mutex_unlock (&job_queue_mutex);
    24.     while(1)
    25.     {
    26.         pthread_mutex_lock (&job_queue_mutex);
    27.         strcpy(buffer,TCP_RECV(sock));
    28.         strcpy(mystruct[myID].action, buffer);
    29.         strcpy(old, buffer);
    30.         if(TCP_SEND(sock,".") == 0){break;}
    31.         strcpy(buffer,TCP_RECV(sock));
    32.         strcpy(mystruct[myID].PX, buffer);
    33.         if(strcmp(buffer, old) == 0){
    34.             pthread_mutex_unlock (&job_queue_mutex);
    35.         break;
    36.         }
    37.         if(TCP_SEND(sock,".") == 0){break;}
    38.         strcpy(buffer,TCP_RECV(sock));
    39.         strcpy(mystruct[myID].PY, buffer);
    40.         if(TCP_SEND(sock,".") == 0){break;}
    41.         strcpy(buffer,TCP_RECV(sock));
    42.         strcpy(mystruct[myID].PZ, buffer);
    43.         if(TCP_SEND(sock,".") == 0){break;}
    44.         strcpy(buffer,TCP_RECV(sock));
    45.         strcpy(mystruct[myID].RY, buffer);
    46.         pthread_mutex_unlock (&job_queue_mutex);
    47.         int ier = 0;
    48.         pthread_mutex_lock (&job_queue_mutex);
    49.         while(ier < id)
    50.         {
    51.             if(ier != myID)
    52.             {
    53.                 TCP_SEND(sock,"LISTP");
    54.                 TCP_RECV(sock);
    55.                 TCP_SEND(sock,mystruct[ier].PX);
    56.                 TCP_RECV(sock);
    57.                 TCP_SEND(sock,mystruct[ier].PY);
    58.                 TCP_RECV(sock);
    59.                 TCP_SEND(sock,mystruct[ier].PZ);
    60.                 TCP_RECV(sock);
    61.                 TCP_SEND(sock,mystruct[ier].RY);
    62.                 TCP_RECV(sock);
    63.                 TCP_SEND(sock,mystruct[ier].action);
    64.                 TCP_RECV(sock);
    65.             }
    66.             ier++;
    67.             //si j'enleve ca le serveur de reagit pas aux intercation.
    68.             cout << "lu" << endl;
    69.         }
    70.         pthread_mutex_unlock (&job_queue_mutex);
    71.         TCP_SEND(sock,"LISTD");
    72.     }
    73.     pthread_mutex_lock (&job_queue_mutex);
    74.         Msql.execute("UPDATE account SET X='%s', Y='%s', Z='%s', Rot='%s',action='%s' WHERE nickname='%s'",PX,PY,PZ,RY,action,nick);
    75.     Msql.execute("UPDATE account SET online='0' WHERE nickname='%s'", nick);
    76.     id--;
    77.     pthread_mutex_unlock (&job_queue_mutex);
    78.     return;
    79. }
    • Partager sur Facebook
    • Partager sur Twitter
      2 septembre 2007 à 23:41:08

      Citation : tenmaCA

      Est ce que les mutexes mette en pause l'execution tant que le mutex n'est pas debloqquer ou passe t-il a la phase suivante (apres le unlock).


      si je dis pas de bêtise, il reste bloqué tant que le mutex demandé n'est pas libéré (ce qui est logique).
      • Partager sur Facebook
      • Partager sur Twitter
        2 septembre 2007 à 23:57:30

        merci mais je ne comprend toujours pas pourquoi si je retire le cout le serveur ne fonctionne pas...
        J'ai trouver une solution qui est un peu bourin mais qui marche.
        Vu que je n'arrivais pas avec mes condition j'ai mit un Sleep(2) a la fin de ma boucle principale grace a cela j'ai pue enlever le cout.

        Je crois que le cout faisais perdre du temps a l'execution et que l'autre thread arrive a prendre le mutex avec le temps de wait. Car en mettant Sleep(1); ca marche pas et tout les valeurs aux dessus de 1 me permette de fonctionne corectement. De plus ce systeme me donne la possibilite de synchroniser le tout.
        • Partager sur Facebook
        • Partager sur Twitter
          3 septembre 2007 à 2:41:29

          Qui te dis que sur une machine moins puissante il te faudrat pas plus de 2ms ?
          • Partager sur Facebook
          • Partager sur Twitter
            3 septembre 2007 à 3:50:39

            Il y aura pas de machine moin puissante. Seulement plus puissant. C'est une toute petite machine qui tourne un vieu AMD 1.4ghz,128mo de ram.
            • Partager sur Facebook
            • Partager sur Twitter
              3 septembre 2007 à 16:22:30

              Mouais bon je trouve pas sa très propre, mais tu fait comme tu veut :-°
              • Partager sur Facebook
              • Partager sur Twitter
                3 septembre 2007 à 16:42:33

                JE pense de toute facon que je mette plus de Sleep ou non ca ne changera rien car la progression des autres thread sera en avance donc forcement qu'ils passeront en premier.
                • Partager sur Facebook
                • Partager sur Twitter
                  4 septembre 2007 à 16:08:23

                  Met un Sleep dans tout tes threads petit méchant :p... Non mais quand même laisse la chance à d'autres d'utiliser le processeur un peu!

                  Bon je ne sais pas si c'est possible avec ta classe (moi j'ai codé mon propre Mutex) tu peux facilement faire une vérification avec de vérouillé du genre :

                  1. Vérifie si le mutex est vérouillé
                  Si non :
                  2. vérouille le mutex
                  3. Traitement
                  4. dévérouille le mutex
                  ...

                  Cette technique est valable lorsque tu vérouille la donnée partagée et non pas le thread.

                  Recherche Google : pthread_mutex_lock
                  "pthread_mutex_lock verrouille le mutex. Si le mutex est déverrouillé, il devient verrouillé et est possédé par le thread appelant; et pthread_mutex_lock rend la main immédiatement. Si le mutex est déjà verrouillé par un autre thread, pthread_mutex_lock suspend le thread appellant jusqu'à ce que le mutex soit déverrouillé."
                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 septembre 2007 à 18:04:04

                    Non mais je met un sleep pour justement laisser les autres obtenir la priorite.
                    Sinon mes mutex lock et unlock on pas l'air de bien marcher.
                    Le Sleep ordonne l'ordre de passage...
                    • Partager sur Facebook
                    • Partager sur Twitter

                    mutexes et bizzarerie

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown