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

C++ Discussion :

les bases threading


Sujet :

C++

  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 les bases threading
    Bonjour,
    je suis débutant dans WIN32 multithreading,j'ai un simple code et des simples questions.
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    #include <iostream>
    #include <Windows.h> 
    #include <process.h>
    #include <stdlib.h>
    using namespace std;
    
    typedef struct struct1
    {
    int entier;
    char* description;
    
    }struct1;
    
    
    unsigned int __stdcall thread(void *param1)
    {	struct struct1 *passed_struct;
    	passed_struct = (struct struct1 *) param1;
    	cout << passed_struct->entier<<"  ";
    	cout<< passed_struct->description<<endl;
    	
    	passed_struct->entier=passed_struct->entier+1;		
    	return(0);
    
    }
    
    int main()
    {
    	int i;
    HANDLE handle[5];
    
    struct1 doublet1;
    
    doublet1.entier=0;
    doublet1.description="something";
    
    
    for(i=0;i<5;i++)
    {
    
    handle[i] = (HANDLE)_beginthreadex(0, 0, &thread, (void*)&doublet1, 0, 0);
    
    
    
    }
    WaitForSingleObject( handle1[0], INFINITE );
    WaitForSingleObject( handle1[1], INFINITE );
    WaitForSingleObject( handle1[2], INFINITE );
    WaitForSingleObject( handle1[3], INFINITE );
    WaitForSingleObject( handle1[4], INFINITE );
    cout <<"final value is"<<doublet1.entier<<endl;
    
    }
    si c'est vrai chaque thread s"execute dans son stack,mais on dit que plusieurs thread dans le meme process partage une memoire partagé,est ce que le fait de referencer un objets et passer son addresse a multiples thread représente la memoire partagé dont on parle.
    et pour ma question à propos de mon code,je désire lancer 5 thread ,une seule thread peut incrementer le champs entier de la structure pointé à la fois,comme ca la prochaine thread va lire cet objet referncé mis à jour ainsi de suite?comme ce faire avec des mutex?

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Effectivement, chaque thread possède sa propre pile. Par contre, tous les thread d'un même process partagent la même mémoire des données.

    Si plusieurs thread doivent atteindre la même variable, il faut alors protéger cette variable avec une section critique.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Citation Envoyé par ram-0000 Voir le message
    Si plusieurs thread doivent atteindre la même variable, il faut alors protéger cette variable avec une section critique.
    Seulement si l'opération effectuée n'est pas atomique (ie se faisant en une seule opération).

    On peut par exemple regarder la valeur d'une variable booléenne/d'un char/short/int ou lui affecter une valeur sans nécessairement passer par une section critique.

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Seulement si l'opération effectuée n'est pas atomique (ie se faisant en une seule opération).
    Tu as raison, ce qui va sans dire va mieux en le disant...
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    @Neckara: Ça dépend des plateforme, d'où la présence de macro pour vérifier le caractère lock-free de ces types. Le mieux restant d'utiliser std::atomic.

  6. #6
    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
    je viens de lire que chaque thread poccéde sa propre pile d'execution ce qui veut dire que toutes les variables locales sont detruites locequ'elles sont hors scope,par contre toute reservation de memoire (malloc,new) faite dans une thread (ou dans la fonction appelante la thread)et visible par toutes threads.en d'autre term ils partagent le Heap.

    donc la portion critique de mon code est bien l'instruction:
    passed_struct->entier=passed_struct->entier+1;
    n'est ce pas ??

  7. #7
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par halil.zakaria Voir le message
    donc la portion critique de mon code est bien l'instruction:
    passed_struct->entier=passed_struct->entier+1;
    n'est ce pas ??
    Mieux vaut faire : (passed_struct->entier)++; l'incrémentation pouvant être atomique selon le type de entier.

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Mieux vaut faire : (passed_struct->entier)++; l'incrémentation pouvant être atomique selon le type de entier.
    Moi, je ne jouerai pas à ce jeu...

    Soit on pose une section critique et le problème est réglé, soit éventuellement on regarde le code assembleur généré afin de voir si' l'instruction générique est atomique (attention, on regarde en debug et en release)

    Mais je vote un gros +1 pour une section critique.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  9. #9
    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
    j'ai essayé de verouiller cette instruction en mettant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    HANDLE ghMutex1;
    ghMutex1 = CreateMutex( NULL, TRUE, NULL);
    struct struct1 *passed_struct;
    passed_struct = (struct struct1 *) param1;
    cout << passed_struct->entier<<"  ";
    cout<< passed_struct->description<<endl;
    WaitForSingleObject(ghMutex1, INFINITE);
     
    passed_struct->entier=(passed_struct->entier)++;
    ReleaseMutex(ghMutex1);
    maintenant à la fin des 5 threads ma variable entier contient la bonne valeur:5
    mais chaque thread ne trouve pas une valeur incrémenté par la précedente thread(toujours des Zeros):

    0 somethi0 something
    ng
    0 something
    0 something
    0 something
    final value is5

  10. #10
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Mieux vaut faire : (passed_struct->entier)++; l'incrémentation pouvant être atomique selon le type de entier.
    +1 ram-0000

    1. c'est le boulot du compilo (et honnêtement, je crois que n'importe quel compilo, même codé avec les pieds, peut transformer un +1 en ++)
    2. soit on a besoin de l'opération soit thread safe et dans ce cas on utilise une section critique (ou un std::atomic), soit on en a pas besoin et on s'en occupe pas.
    Dans tous les cas, on suppose que c'est jamais thread safe, sauf explicitement indiqué (mutex, atomic, etc)

  11. #11
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Permettez-moi de n'incruster...

    La section critique n'est utile qu'en écriture, pas en lecture, n'est-ce pas ?
    Tous les threads peuvent accéder simultanément en lecture à une resource.
    Mais alors comment:
    -lorsqu'un thread veut accéder en écriture, bloquer tous les autres threads ?
    -lorsqu'un thread veut accéder en lecture, ne bloquer que ceux qui veulent accéder en écriture ?
    merci.

  12. #12
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par camboui Voir le message
    Mais alors comment:
    -lorsqu'un thread veut accéder en écriture, bloquer tous les autres threads ?
    -lorsqu'un thread veut accéder en lecture, ne bloquer que ceux qui veulent accéder en écriture ?
    Dès lors qu'une donnée peut être modifiée par un ou plusieurs threads et peut être lue par un ou plusieurs autres threads, aussi bien les écrivains que les lecteurs doivent utiliser une section critique sinon ... c'est le drame.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  13. #13
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Oui, la concurrence se pose que lorsque 2 threads essaient d'accéder en écriture. Si par exemple, tu as 2 threads qui font x = x + 1, tu vas avoir les opérations atomiques suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    lire x
    additionner x 1
    écrire x
    Si tu as une modification de x entre la lecture et l'écriture, la valeur de x ne sera pas correcte

    En pratique, tu ajoutes un mutex partagé entre tes ressources qui veulent accéder en écriture, tu fais un lock sur ce mutex avant de faire ton opération et tu libère à la fin. Cela garantie que tous tes threads qui veulent un accès en écriture ne s'emmêlent pas les pinceaux.
    Pas besoin de locker quand tu fais un accès en écriture. Par contre, oui, tu locks tous les autres threads pour l'écriture (sauf accès non blockant, cf les proposals de Sutter, j'en parle dans les commentaires de cette discussion : http://blog.emmanueldeloget.com/inde...%2C-conditions)

  14. #14
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Dès lors qu'une donnée peut être modifiée par un ou plusieurs threads et peut être lue par un ou plusieurs autres threads, aussi bien les écrivains que les lecteurs doivent utiliser une section critique sinon ... c'est le drame.
    Je précise mon propos en voyant ta réponse : si on parle de la lecture d'une variable seule, l'opération sera "atomique" de toute façon. Par contre, si on parle de lire un objet complexe, contenant plusieurs variables, l'objet peut effectivement être modifié entre 2 lectures et il faudra protéger aussi la lecture

    (il faut lire les travaux du groupe "mémoire transactionnelle" )

  15. #15
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    si on parle de la lecture d'une variable seule, l'opération sera "atomique" de toute façon
    Oui, en général ceci dit, j'ai vu des cas tordu d'une variable sur 16 bits non alignée (mais c'était voulu) qui était lue en 2 accès mémoire par les instructions en assembleur.

    Donc dans ce cas, section critique car la lecture n'était pas atomique.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  16. #16
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Oui, en général ceci dit, j'ai vu des cas tordu d'une variable sur 16 bits non alignée (mais c'était voulu) qui était lue en 2 accès mémoire par les instructions en assembleur.

    Donc dans ce cas, section critique car la lecture n'était pas atomique.
    Bouh, que c'est moche
    Bon, ça rentre dans la catégorie "objet complexe" je suppose (je sais pas si c'est possible de modifier le padding sans utiliser de struct, si ?)
    Mais effectivement, j'imagine que la lecture d'un double sur certaines plateformes ou de long double posera aussi des problèmes.
    Ton conseil de locker aussi en lecture n'est pas aberrant

  17. #17
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Oui, mais je pense que ma question n'a pas été comprise.

    Tant qu'il n'y a pas de demande d'écriture, comment ne pas bloquer les lectures afin qu'elles puissent avoir lieu simultanément, tout en les bloquant lorsqu'il y aura une écriture ? (blocage seulement dans ce cas précis)

    Exemple
    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
    void mtfoo ()
    {
     
    ...
     
    lock_resource_for_readers_and_writers();
    write_resource();
    unlock_resource();
     
    ...
     
    //blocage uniquement pour les écritures
    lock_resource_for_writers_only();
    read_resouce();
    unlock_resource();
     
    ...
     
    }

  18. #18
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par camboui Voir le message
    Oui, mais je pense que ma question n'a pas été comprise.
    Si si

    Citation Envoyé par camboui Voir le message
    Tant qu'il n'y a pas de demande d'écriture, comment ne pas bloquer les lectures afin qu'elles puissent avoir lieu simultanément, tout en les bloquant lorsqu'il y aura une écriture ? (blocage seulement dans ce cas précis)
    Je pense que ce n'est pas possible.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  19. #19
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    ?

    J'ai trouvé ce code qui semble le permettre
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    class CRWLock
    {
     
        LONG ReaderCount;
        HANDLE WriterLock;
        HANDLE WriteEvent;
        HANDLE ReadEvent;
     
      public:
     
        enum RWLockType
        {
          Reader,
          Writer
        };
     
        CRWLock()
        {
          WriterLock = CreateEvent(0, false, true, 0);
          WriteEvent = CreateEvent(0, true, true, 0);
          ReadEvent = CreateEvent(0, true, false, 0);
          ReaderCount = -1;
        }
     
        ~CRWLock()
        {
          CloseHandle(WriteEvent);
          CloseHandle(WriterLock);
          CloseHandle(ReadEvent);
        }
     
        DWORD Lock(RWLockType type, DWORD dwTimeOut = INFINITE)
        {
          // An arbitrary number of readers (all in the same process) can own the lock at any time,
          // but no more than one writer can own it
     
          DWORD dwRes;
           if(type == Writer)
          {
            ResetEvent(WriteEvent);
            if ((dwRes = WaitForSingleObject(WriterLock, dwTimeOut)) == WAIT_TIMEOUT)
              return dwRes;
          }
          else
          {
            if ((dwRes = WaitForSingleObject(WriteEvent, dwTimeOut)) == WAIT_TIMEOUT)
              return dwRes;
            if(InterlockedIncrement(&ReaderCount) == 0)
            {
              if ((dwRes = WaitForSingleObject(WriterLock, dwTimeOut)) == WAIT_TIMEOUT)
                return dwRes;
              SetEvent(ReadEvent);
            }
            if ((dwRes = WaitForSingleObject(ReadEvent, dwTimeOut)) == WAIT_TIMEOUT)
              return dwRes;
          }
     
          return dwRes;
        }
     
        void Unlock(RWLockType type)
        {
          if(type == Writer)
          {
            SetEvent(WriterLock);
            SetEvent(WriteEvent);
          }
          else if(InterlockedDecrement(&ReaderCount) < 0)
          {
            ResetEvent(ReadEvent);
            SetEvent(WriterLock);
          }
        }
     
    };
     
    class CAutoRWLock
    {
    public:
     
        CAutoRWLock(CRWLock& l,CRWLock::RWLockType t, DWORD dwTimeOut = INFINITE)
            :rwL(l),rwType(t)
        { rwL.Lock(rwType,dwTimeOut); }
        virtual ~CAutoRWLock()
        { rwL.Unlock(rwType); }
    protected:
        CRWLock& rwL;
        CRWLock::RWLockType rwType;
    };
    Qui s'utilise comme ceci si j'ai bien compris:
    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
     
    CRWLock glock;
     
    void mtfoo ()
    {
     
    ...
     
    {
    //blocage pour les écritures et les lectures
    CAutoRWLock(glock, CRWLock::RWLockType::Writer);
    write_resource();
    }
     
    ...
     
    {
    //blocage uniquement pour les écritures
    CAutoRWLock(glock, CRWLock::RWLockType::Reader);
    read_resouce();
    }
     
    ...
     
    }

  20. #20
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Ca ressemble à une "message queue" + un lock pour l'accès

Discussions similaires

  1. connaitre les bases qui existes
    Par nycagi dans le forum Administration
    Réponses: 13
    Dernier message: 08/06/2004, 12h29
  2. Les Bases de Données! tout un monde!!
    Par kikimnet dans le forum Bases de données
    Réponses: 3
    Dernier message: 29/04/2004, 18h26
  3. Lister les bases
    Par Neuromancien2 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 26/01/2004, 09h12
  4. Réponses: 1
    Dernier message: 01/08/2002, 21h09

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