IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

Threads & Processus C++ Discussion :

mauvaise synchronization des thread


Sujet :

Threads & Processus C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Consultant en s�curit�
    Inscrit en
    Ao�t 2011
    Messages
    21
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activit� : Consultant en s�curit�
    Secteur : Services de proximit�

    Informations forums :
    Inscription : Ao�t 2011
    Messages : 21
    Par d�faut mauvaise synchronization des thread
    bonjour,
    avant de poser ma question,je tiens � faire une petite description de mon code.
    je dispose d'une fonction qui me g�nere des elements,je passe ces elements � une fonction qui monte une socket et appele deux thread une pour r�cuperer les r�ponses du serveur,l'autre pour l'envoi des �lements g�n�r�s),jusqu'ici tout est bon,ce traitement(S�quentiel:1envoi � la fois) demeure lent,je d�sire le rendre rapide(dans cet exemple 2 envois � la fois) et du coup j'ai transform� la fonction qui monte la socket � son tour � une Thread,comme �a la fonction de g�n�ration peut g�nerer un lot d'elements et appeler plusieurs thread de montage de sockets qui � leur tour appelent les threads d'envoi et de reception sur chaque socket .


    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    void generer(char* element1,char* element2,int i,int j)
    {
     
    HANDLE myhandle_send_it_via_socket_lot1;
    HANDLE myhandle_send_it_via_socket_lot2,
     
     struct thread_params_send send_params;
     
     
    element1=.....;//traitement des element1
    element2=.....;//traitement des element2
     
     
    while(condition)//tant kil y'a des elements à envoyer
          {
            cout <<"affichage";
            cout <<"affcihage";
     
           send_params.element1=element1;
           send_params.element2=element2;
     
    myhandle_send_it_via_socket_lot1 = (HANDLE)_beginthreadex(0, 0, &Send_it_via_socket, (void*)&send_params, 0, 0);
     
     
    element1=x;//transformation des elements generés
    element2=y;//transformation des elementsgenéres
     
    send_params.element1=element1;
    send_params.element2=element2;
     
    myhandle_send_it_via_socket_lot2 = (HANDLE)_beginthreadex(0, 0, &Send_it_via_socket, (void*)&send_params, 0, 0);
     
    WaitForSingleObject( myhandle_send_it_via_socket_lot1, INFINITE );
    WaitForSingleObject( myhandle_send_it_via_socket_lo2, INFINITE );
     
     
           }
     
     
     
    }
    donc je me trouve avec:

    g�n�rer()->thread send_it_via_socket_lot1->thread envoi socket
    g�n�rer()->thread send_it_via_socket_lot1->thread r�ception socket
    g�nerer()->thread_send_it_via_socket_lot2->thread envoi socket
    g�n�rer()->thread send_it_via_socket_lot2->thread r�ception socket

    question:
    a-les thread d'envoie et de reception socket affichent des r�sultant,donc j'ai un affichage en d�sordre et d�sagr�able
    Comment am�liorer cet affichage?

    b-lorsque je transforme:
    element1=x;//transformation des elements gener�s
    element2=y;//transformation des elementsgen�res
    on dirait que c'est la premi�re thread avec le handle myhandle_send_it_via_socket_lot1 qui prend les valeurs chang�s malgr� que je l'ai appel� avec les anciens valeur du parametre (void*)&send_params
    donc je me trouve oblig� de mettre un waitforobjects avant la transformation des parametres,si j'attend thread send_it_via_socket_lot1 qu'elle termine �a veut dire que j'ai rien gagn�.je me retrouve dans le r�gime s�quentiel...(((((

    des suggestion sont la bienvenue.

  2. #2
    Membre Expert

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par d�faut
    Citation Envoy� par halil.zakaria Voir le message
    bonjour,
    avant de poser ma question,je tiens � faire une petite description de mon code.
    je dispose d'une fonction qui me g�nere des elements,je passe ces elements � une fonction qui monte une socket et appele deux thread une pour r�cuperer les r�ponses du serveur,l'autre pour l'envoi des �lements g�n�r�s),jusqu'ici tout est bon,ce traitement(S�quentiel:1envoi � la fois) demeure lent,je d�sire le rendre rapide(dans cet exemple 2 envois � la fois) et du coup j'ai transform� la fonction qui monte la socket � son tour � une Thread,comme �a la fonction de g�n�ration peut g�nerer un lot d'elements et appeler plusieurs thread de montage de sockets qui � leur tour appelent les threads d'envoi et de reception sur chaque socket .


    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    void generer(char* element1,char* element2,int i,int j)
    {
     
    HANDLE myhandle_send_it_via_socket_lot1;
    HANDLE myhandle_send_it_via_socket_lot2,
     
     struct thread_params_send send_params;
     
     
    element1=.....;//traitement des element1
    element2=.....;//traitement des element2
     
     
    while(condition)//tant kil y'a des elements à envoyer
          {
            cout <<"affichage";
            cout <<"affcihage";
     
           send_params.element1=element1;
           send_params.element2=element2;
     
    myhandle_send_it_via_socket_lot1 = (HANDLE)_beginthreadex(0, 0, &Send_it_via_socket, (void*)&send_params, 0, 0);
     
     
    element1=x;//transformation des elements generés
    element2=y;//transformation des elementsgenéres
     
    send_params.element1=element1;
    send_params.element2=element2;
     
    myhandle_send_it_via_socket_lot2 = (HANDLE)_beginthreadex(0, 0, &Send_it_via_socket, (void*)&send_params, 0, 0);
     
    WaitForSingleObject( myhandle_send_it_via_socket_lot1, INFINITE );
    WaitForSingleObject( myhandle_send_it_via_socket_lo2, INFINITE );
     
     
           }
     
     
     
    }
    donc je me trouve avec:

    g�n�rer()->thread send_it_via_socket_lot1->thread envoi socket
    g�n�rer()->thread send_it_via_socket_lot1->thread r�ception socket
    g�nerer()->thread_send_it_via_socket_lot2->thread envoi socket
    g�n�rer()->thread send_it_via_socket_lot2->thread r�ception socket

    question:
    a-les thread d'envoie et de reception socket affichent des r�sultant,donc j'ai un affichage en d�sordre et d�sagr�able
    Comment am�liorer cet affichage?

    b-lorsque je transforme:
    element1=x;//transformation des elements gener�s
    element2=y;//transformation des elementsgen�res
    on dirait que c'est la premi�re thread avec le handle myhandle_send_it_via_socket_lot1 qui prend les valeurs chang�s malgr� que je l'ai appel� avec les anciens valeur du parametre (void*)&send_params
    donc je me trouve oblig� de mettre un waitforobjects avant la transformation des parametres,si j'attend thread send_it_via_socket_lot1 qu'elle termine �a veut dire que j'ai rien gagn�.je me retrouve dans le r�gime s�quentiel...(((((

    des suggestion sont la bienvenue.
    Sans le code des threads, �a me parait compliqu� � v�rifier, mais ou sont les synchronisations ?

    Tel que je le vois, tu r�utilise la m�me structure pour stocker les donn�es que tu envoie aux deux threads. Qui plus est, tu leur passe un pointeur sur cette structure. Du coup, il n'est pas anormal que les deux threads aient les m�me donn�es � traiter (ou, quelques fois, des donn�es diff�rentes).

    Pour ce qui est des cout, je te rappelle que c'est un objet global. Du coup, si tu fais

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    // thread 1
    cout << "aaaaaaaaaaaaaaaaaaaaa";
    // thread 2
    cout << "bbbbbbbbbbbbbbbbbbbbb";
    Rien ne te garanti que tu ne vas pas avoir quelque chose d'�trange comme ababababababbbabaabbaba... en sortie. L� aussi, il faut synchroniser les appels via une zone d'exclusion mutuelle (un mutex, pour faire simple).

    C++11 pr�cise davantage le mod�le de m�moire de C++ et propose les solutions pour palier aux probl�mes d'acc�s concurrentiels � une donn�e (ce qu'on appelle un data race). Tu peux te renseigner sur le sujet, histoire de comprendre un peu mieux (et si ton compilateur supporte std::thread, je te propose de l'utiliser, au lieu d'utiliser _beginthread/_beginthreadex ; tu va voir, �a sera plus simple .
    [FAQ des forums][FAQ D�veloppement 2D, 3D et Jeux][Si vous ne savez pas ou vous en �tes...]
    Essayez d'�crire clairement (c'est � dire avec des mots fran�ais complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Caf�. C'est d�pass� tout �a.
    Et si vous �tes sages, vous aurez peut �tre vous aussi la chance de passer � la t�l�. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre averti
    Homme Profil pro
    Consultant en s�curit�
    Inscrit en
    Ao�t 2011
    Messages
    21
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activit� : Consultant en s�curit�
    Secteur : Services de proximit�

    Informations forums :
    Inscription : Ao�t 2011
    Messages : 21
    Par d�faut Threads
    une autre question,si j'appele la thread montage_socket_improvis�() � partir de ma fonction main_improvis�() 2 fois est ce que je vais me trouver avec 2 socket connect�s � mon serveur,ou une seulement partag� entre les 2 threads.Merci
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    main_improvisé()
    {
    HANDLE handle_thread,socket1,handle_thread,socket2;
    handle_thread,socket1 = (HANDLE)_beginthreadex(0, 0, &montage_socket_improvisé, (void*), 0, 0);
    handle_thread,socket2= (HANDLE)_beginthreadex(0, 0, &montage_socket_improvisé, (void*), 0, 0);
    }
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    unsigned int __stdcall montage_socket_improvisé(void *)
    {
     
     
    SOCKET s;
    struct sockaddr_in server_address;
     
     
    s = socket(AF_INET, SOCK_STREAM, 0);  
     
    connect(s,(const struct sockaddr FAR *) &server_address,sizeo(SOCKADDR_IN))
     
    ZeroMemory(&server_address, sizeof(SOCKADDR_IN));
    server_address.sin_family = AF_INET;  
    server_address.sin_port = htons(SERVER_PORT);
    CopyMemory(&server_address.sin_addr, hp->h_addr_list[0], hp->h_length);
     
     
     
    return(1);

  4. #4
    Membre Expert

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par d�faut
    Citation Envoy� par halil.zakaria Voir le message
    une autre question,si j'appele la thread montage_socket_improvis�() � partir de ma fonction main_improvis�() 2 fois est ce que je vais me trouver avec 2 socket connect�s � mon serveur,ou une seulement partag� entre les 2 threads.Merci
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    main_improvisé()
    {
    HANDLE handle_thread,socket1,handle_thread,socket2;
    handle_thread,socket1 = (HANDLE)_beginthreadex(0, 0, &montage_socket_improvisé, (void*), 0, 0);
    handle_thread,socket2= (HANDLE)_beginthreadex(0, 0, &montage_socket_improvisé, (void*), 0, 0);
    }
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    unsigned int __stdcall montage_socket_improvisé(void *)
    {
     
     
    SOCKET s;
    struct sockaddr_in server_address;
     
     
    s = socket(AF_INET, SOCK_STREAM, 0);  
     
    connect(s,(const struct sockaddr FAR *) &server_address,sizeo(SOCKADDR_IN))
     
    ZeroMemory(&server_address, sizeof(SOCKADDR_IN));
    server_address.sin_family = AF_INET;  
    server_address.sin_port = htons(SERVER_PORT);
    CopyMemory(&server_address.sin_addr, hp->h_addr_list[0], hp->h_length);
     
     
     
    return(1);
    Tu cr�e deux threads, et tu leur dit d'ex�cuter le code de la fonction montage_socket_improvis�().

    Dans chaque thread, tu cr�e une socket et tu la connecte.

    Ce qui fait que tu cr�e deux sockets et que tu les connecte.

    Donc oui, n�cessairement, tu auras deux connexions sur ton serveur.

    La programmation, ce n'est pas magique. Le programme fait ce que tu lui dit de faire, que tu soit en multithread ou non. Il ne partage pas par magie des informations entre deux threads : soit les informations sont partag�es parce que que tu lui demande explicitement (comme dans le premier message), soit elles sont partag�es parce qu'elles ne sont pas locales aux threads (par exemple une variable globale ou statique � une fonction).

    Le reste n'est pas partag�.

    Il semblerait que tu ais des probl�mes pour comprendre certains concepts li�s � la programmation concurrente. Puisque c'est crucial dans ton domaine d'�crire du code qui est s�r (vu que tu es consultant s�curit�), il faut absolument que tu ma�trise ces concepts - sans quoi, tu va cr�er plus de probl�mes que tu ne vas en r�soudre, et tu risque fort d'augmenter la surface d'attaque de l'application que tu �crit.

    Puis-je te conseiller de lire le maximum de choses sur le sujet, y compris sur ce forum ou des livres un peu ancien comme "Win32 Multithread Programming" (http://shop.oreilly.com/product/9781565922969.do) (en anglais) ? Il me semble que c'est la chose � faire.
    [FAQ des forums][FAQ D�veloppement 2D, 3D et Jeux][Si vous ne savez pas ou vous en �tes...]
    Essayez d'�crire clairement (c'est � dire avec des mots fran�ais complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Caf�. C'est d�pass� tout �a.
    Et si vous �tes sages, vous aurez peut �tre vous aussi la chance de passer � la t�l�. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

Discussions similaires

  1. R�ponses: 9
    Dernier message: 03/11/2014, 11h52
  2. Probl�me de modification des param�tres avec des threads synchrones
    Par manelhaj dans le forum Threads & Processus
    R�ponses: 5
    Dernier message: 22/09/2013, 11h03
  3. [reseaux] Gestion des threads en perl
    Par totox17 dans le forum Programmation et administration syst�me
    R�ponses: 2
    Dernier message: 28/11/2002, 09h40
  4. R�ponses: 3
    Dernier message: 04/09/2002, 09h42
  5. Programmer des threads
    Par haypo dans le forum C
    R�ponses: 6
    Dernier message: 02/07/2002, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo