C++ read-write access threadsafe

C++ read-write access threadsafe - C++ - Programmation

Marsh Posté le 03-02-2003 à 17:18:20    

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 ??

Reply

Marsh Posté le 03-02-2003 à 17:18:20   

Reply

Marsh Posté le 03-02-2003 à 18:49:46    

c trop dur pour vous ?? ;-)

Reply

Marsh Posté le 03-02-2003 à 20:21:39    

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

Reply

Marsh Posté le 03-02-2003 à 20:49:21    

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:

Reply

Marsh Posté le 03-02-2003 à 22:42:07    

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

Reply

Marsh Posté le 04-02-2003 à 11:10:42    

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.

Reply

Marsh Posté le 04-02-2003 à 13:41:41    

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

Reply

Marsh Posté le 04-02-2003 à 16:27:39    

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

Reply

Marsh Posté le 04-02-2003 à 17:34:04    

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
 

Reply

Marsh Posté le 05-02-2003 à 14:38:56    

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

Reply

Marsh Posté le 05-02-2003 à 14:38:56   

Reply

Marsh Posté le 05-02-2003 à 15:27:56    

man 3 pthread_cond_wait

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed