Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1197 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  C++ read-write access threadsafe

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

C++ read-write access threadsafe

n°300277
solvene
Posté le 03-02-2003 à 17:18:20  profilanswer
 

Bonjour,
Je souhaiterai proteger le lecture et l'ecriture d'un fichier en environnement multithread, afin de permettre a plusieurs clients de lire un fichier en meme temps mais un seul client doit pouvoir le modifier pdt que les autres sont bloqués.
 
Un truc du style Readers/Writer Lock Class avec mutex ou autre....  
 
Et j'aurai besoin d'implementer ca surtout sous Unix.
Pouvez-vous m'aider ??

mood
Publicité
Posté le 03-02-2003 à 17:18:20  profilanswer
 

n°300391
solvene
Posté le 03-02-2003 à 18:49:46  profilanswer
 

c trop dur pour vous ?? ;-)

n°300438
Taz
bisounours-codeur
Posté le 03-02-2003 à 20:21:39  profilanswer
 

et ben tu devrais commencer à regarde le man de open pour une ouverture exclusive et t'a qu'a faire une jolie classe wrapper pour fstream avec un petit pthread_mutex_t

n°300461
solvene
Posté le 03-02-2003 à 20:49:21  profilanswer
 

Merci :-)  :ange:  
Que veux-tu dire par classe wrapper ? une classe interface qui a pour var private un mutex dont je me servirais pour faire un lock a chaque acces ?  
 
J'ai aussi des données (var privées d'un singleton threadsafe) que je veux pouvoir changer en read/write access, tout comme le fichier...
 :bounce:

n°300498
Taz
bisounours-codeur
Posté le 03-02-2003 à 22:42:07  profilanswer
 

exactement: juste une classe d'enrobage avec la classe a enrober en public (ici un fstream), un mutex en privé et 2 jolis fonctions lock & unlock, c'est la solution la plus rapide et la meilleure: le verrou est utilisable en encadrant une seule opération( un write par exemple) mais aussi sur un ensemble pour assurer la cohérence de la transaction

n°300761
solvene
Posté le 04-02-2003 à 11:10:42  profilanswer
 

Merci, c ce que je pensais faire a peu pres.
Au debut je pensais faire une class read/write access pour une meilleure optimisation, avec semaphore et gate, ms c plus long a implementer.
Un truc ce ce style :
 

Code :
  1. class RWLock : private Mutex {
  2. private:
  3.   Semaphore write_lock;      // used as a one-at-a-time release valve
  4.   Gate read_barrier;         // used to block/wakeup readers
  5.   unsigned int writer_count; // # of writers waiting for or holding the lock
  6.   unsigned int reader_count; // # of readers holding the lock
  7. public:
  8.   ReadLock(void) {
  9.     writer_count = 0;
  10.     reader_count = 0;
  11.   }
  12.   void ReadLock(void) {
  13.     Mutex::Lock();
  14.     // wait until there are no more writers holding the lock
  15.     while (writer_count > 0) {
  16.       Mutex::Unlock();
  17.       read_barrier.Wait();
  18.       Mutex::Lock();
  19.     }
  20.     reader_count++;
  21.     Mutex::Unlock();
  22.   }
  23.   void WriteLock(void) {
  24.     Mutex::Lock();
  25.     writer_count++;       // this stops new readers from getting a lock
  26.     write_lock.Wait();    // wait until the write lock is available
  27.     read_barrier.Close(); // give new readers something to wait for
  28.     Mutex::Unlock();
  29.   }
  30.   void Unlock(void) {
  31.     Mutex::Lock();
  32.     if (writer_count > 0) {  // we must be a writer
  33.       writer_count--;
  34.       if (writer_count > 0)  // another writer is waiting
  35.         writer_lock.Post();  // let it go
  36.       else
  37.         read_barrier.Open(); // open the floodgates
  38.     }
  39.     else {
  40.       reader_count--;
  41.       // if we're the last reader and a writer is waiting, let it go
  42.       if ((reader_count == 0) && (writer_count > 0)) {
  43.         writer_lock.Post();
  44.     }
  45.     Mutex::Unlock();
  46.   }
  47. };


 
Mais j'aurais du mal a rendre cette solution multiplatforme..
Ta solution suffira, et est tout aussi sure. Merci encore.

n°300849
Taz
bisounours-codeur
Posté le 04-02-2003 à 13:41:41  profilanswer
 

peut etre est-il mieux de voir du coté des attentes passives plutot que des boucles (pthread_cond_wait)

n°301136
solvene
Posté le 04-02-2003 à 16:27:39  profilanswer
 

Tu as surment raison, je ne connaissais pas pthread_cond_wait ...
Je vais voir ca.
Merci  :sarcastic:

n°301237
Taz
bisounours-codeur
Posté le 04-02-2003 à 17:34:04  profilanswer
 

while (writer_count > 0) {
     Mutex::Unlock();
     read_barrier.Wait();
     Mutex::Lock();  
 
tout ça remplacer par une jolie condition, et ça va marche du tonnerre
 
il y a aussi des semaphores avec les linuxthread (pas les meme que SysV)
 
man 3 sem_init
 
tres facile d'emploi
 

n°302305
solvene
Posté le 05-02-2003 à 14:38:56  profilanswer
 

Une jolie condition ? Que veux-tu dire ??  :??:  
 
Moi je souhaiterai utilser les Posix threads (Unix).
 
Merci ! ;)  

mood
Publicité
Posté le 05-02-2003 à 14:38:56  profilanswer
 

n°302364
Taz
bisounours-codeur
Posté le 05-02-2003 à 15:27:56  profilanswer
 

man 3 pthread_cond_wait


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  C++ read-write access threadsafe

 

Sujets relatifs
[BAT] lancer un compactage de base access[ACCESS] Filtrer données liste déroulante par rapport à une autre list
[Access] bizarrerie sur fonction Format[ASP] : viewer ACCESS
[access] champs texte dans un sous formulaire ?!?(VBA et Access) Empecher l'affichage d'une fenetre d'importation
Bug avec VB liaison avec base accessImport de données au format access (fichier mdb) par un utilisateur
[Access] Tronquer l'heure dans une date[ACCESS] Protéger l'acces à un formulaire (par mot de passe...) ?
Plus de sujets relatifs à : C++ read-write access threadsafe


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR