codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
#ifndef DatenModul_hpp #define DatenModul_hpp #include <string> #include <map> #include <boost/thread.hpp> #include "Modul.hpp" class DatenModul { public: DatenModul(int); void anmeldenModul(Modul*); void eintragenDaten(std::string); Modul* abfragenDaten(std::string); std::string abfragenModul(boost::thread::id); bool bereit(); protected: std::map< boost::thread::id, Modul* > ModuleListe; std::map< std::string, boost::thread::id > DatenZuModulListe; int AnzahlModule; int bereiteModule; boost::mutex DatenZuModulListeMutex; boost::mutex ModulListeMutex; boost::condition_variable_any DatenZuModulListeEintrag; boost::condition_variable_any DatenModulBereit; }; #endif #include "DatenModul.hpp" #include "GlobaleFunktionen.cpp" DatenModul::DatenModul(int i) : AnzahlModule(i) {}; void DatenModul::anmeldenModul(Modul* M) { std::cout << "A" << std::endl; boost::lock_guard<boost::mutex> lock(ModulListeMutex); std::cout << "B" << std::endl; boost::thread::id ID = boost::this_thread::get_id(); std::cout << "C " << ID << std::endl; ModuleListe.insert( std::make_pair( ID, M ) ); //ModuleListe[ID]=M; #ifdef DEBUG std::stringstream ausgabe; ausgabe << "Datenmodul: " << abfragenModul(ID) << " hat sich angemeldet"; debugging(ausgabe.str()); #endif }; std::string DatenModul::abfragenModul(boost::thread::id ID) { boost::lock_guard<boost::mutex> lock(ModulListeMutex); std::map< boost::thread::id, Modul* >::iterator i; i = ModuleListe.find(ID); if( i==ModuleListe.end() ) return "NICHT GEFUNDEN!"; else return i->second->Modulname; }; void DatenModul::eintragenDaten(std::string D) { boost::lock_guard<boost::mutex> lock(DatenZuModulListeMutex); boost::thread::id ID = boost::this_thread::get_id(); DatenZuModulListe[D]=ID; DatenZuModulListeEintrag.notify_all(); #ifdef DEBUG std::stringstream ausgabe; ausgabe << "Datenmodul: " << abfragenModul(ID) << " hat sich für " << D << " eingetragen."; debugging(ausgabe.str()); #endif }; Modul* DatenModul::abfragenDaten(std::string D) { boost::lock_guard<boost::mutex> lock(DatenZuModulListeMutex); std::map< std::string, boost::thread::id >::iterator i; i = DatenZuModulListe.find(D); while( i==DatenZuModulListe.end() ) { #ifdef DEBUG std::stringstream ausgabe; ausgabe << "Datenmodul: " << abfragenModul(boost::this_thread::get_id()) << " hat ERFOLGLOS das Erstellermodul von " << D << " abgefragt. Warte auf Eintrag!"; debugging(ausgabe.str()); #endif DatenZuModulListeEintrag.wait(DatenZuModulListeMutex); i = DatenZuModulListe.find(D); } { boost::lock_guard<boost::mutex> lock(ModulListeMutex); std::map< boost::thread::id, Modul* >::iterator i2; i2 = ModuleListe.find(i->second); if( i2==ModuleListe.end() ) { #ifdef DEBUG std::stringstream ausgabe; ausgabe << "Datenmodul: FEHLER i2==ModuleListe.end()"; debugging(ausgabe.str()); #endif } else { #ifdef DEBUG std::stringstream ausgabe; ausgabe << "Datenmodul: " << abfragenModul(boost::this_thread::get_id()) << " hat das Erstellermodul von " << D << " abgefragt."; debugging(ausgabe.str()); #endif return i2->second; } } }; bool DatenModul::bereit() { boost::lock_guard<boost::mutex> lock(ModulListeMutex); ++bereiteModule; #ifdef DEBUG std::stringstream ausgabe; ausgabe << "Datenmodul: " << abfragenModul(boost::this_thread::get_id()) << " ist bereit. " << bereiteModule << " von "<< AnzahlModule << " Modulen sind bereit."; debugging(ausgabe.str()); #endif if( bereiteModule==AnzahlModule) { DatenModulBereit.notify_all(); } while( bereiteModule!=AnzahlModule ) DatenModulBereit.wait(ModulListeMutex); return true; }
Private
[
?
]
Run code
Submit