Une classe zone_transit

Des explications suivront quand j'aurai un peu plus de temps. Notez qu'il serait possible d'aller plus loin en définissant une liste sans verrous.

Version simple

Cette version ne laisse circuler que des chaînes de caractères.

#include <string>
#include <mutex>
class zone_transit {
public:
   using value_type = std::string;
private:
   str_type texte;
   std::mutex m;
public:
   void ajouter(const value_type &s) {
      using namespace std;
      lock_guard<mutex> _ { m };
      texte += s;
   }
   value_type extraire() {
      using namespace std;
      lock_guard<mutex> _ { m };
      str_type s;
      s.swap(texte);
      return s;
   }
};

Si on tient compte de la qualification volatile, on a :

#include <string>
#include <mutex>
class zone_transit {
public:
   using value_type = std::string;
private:
   str_type texte;
   std::mutex m;
   std::unique_lock<std::mutex> verrouiller() const volatile {
      return std::unique_lock<std::mutex> { const_cast<mutex&>(m) };
   }
public:
   void ajouter(const value_type &s) volatile {
      auto verrou = verrouiller();
      const_cast<zone_transit&>(*this).ajouter(s);
   }
   void ajouter(const value_type &s) {
      texte += s;
   }
   value_type extraire() {
      str_type s;
      s.swap(texte);
      return s;
   }
   value_type extraire() volatile {
      auto verrou = verrouiller();
      return const_cast<zone_transit&>(*this).extraire();
   }
};

Version plus riche

Cette version fait circuler des instances d'un certain type T.

#include <mutex>
#include <vector>
template <class T>
   class zone_transit {
   public:
      using value_type = T;
   private:
      std::vector<T> data;
      std::mutex m;
   public:
      template <class It>
         void ajouter(It debut, It fin) {
            using namespace std;
            lock_guard<mutex> _ { m };
            data.insert(data.end(), debut, fin);
         }
      auto extraire() {
         using namespace std;
         lock_guard<mutex> _ { m };
         vector<T> vals;
         vals.swap(data);
         return vals;
      }
   };

Voilà.


Valid XHTML 1.0 Transitional

CSS Valide !