Thread Syncronisation
-
Hallo,
ich hätte dann noch eine Frage zur Thread Syncronisation.
#ifndef CONSUMER_H #define CONSUMER_H #include <iostream> #include"Ablage.h" class Consumer { public: Consumer(Ablage& a) : ablage(a) { } void operator()() { try { while(true) { // Abbruch mit Exception int wert = ablage.get(); boost::lock_guard<boost::mutex> lock(ausgabeMutex); std::cout << "Consumer hat " << wert << " geholt." << std::endl; } } catch(...) { boost::lock_guard<boost::mutex> lock(ausgabeMutex); std::cout << "Consumer beendet sich." << std::endl; } } private: Ablage& ablage; }; #endif#ifndef PRODUCER_H #define PRODUCER_H #include <iostream> #include<Random.h> #include"Ablage.h" class Producer { public: Producer(Ablage& a, int i) : ablage(a), id(i), zufall(500) { } void operator()() { for(int i = 0; i < 5; ++i) { int wert = id*10 + i; boost::this_thread::sleep( boost::posix_time::millisec(200 + zufall())); try { ablage.put(wert); boost::lock_guard<boost::mutex> lock(ausgabeMutex); std::cout << "Producer Nr. " << id << " legt ab: " << wert << std::endl; } catch(...) { break; // Producer ist beendet } } boost::lock_guard<boost::mutex> lock(ausgabeMutex); std::cout << "Producer " << id << " beendet sich." << std::endl; } private: Ablage& ablage; int id; Random zufall; }; #endifWieso muss die Ausgabe mit Mutex abgesichert werden? ich dachte immer das verwendet man, wenn man gemeinsame Variablen nutzt? Oder ist hier cout die gemeinsame Variable und es könnten so die Buchstaben gemixt werden
?
-
Jap. cout ist geshared und wird nicht synchronisiert. Kann also gut sein, wenn es nicht synchronisiert wird, dass Buchstaben durcheinander kommen.
-
da der aktuelle C++ standard keine threads kennt, gibt es auch keinerlei garnatien bezüglich cout.
eine vernünftige implementierung wird zwar niemals "bab" ausgeben wenn ein thread << "a" macht und der andere << "bb".
allerdings kann man IMO nicht standardkonform sicherstellen, dass nicht "bab" rauskommt, wenn der 2. thread << "b" << "b" machen würde statt << "bb".
und da der standard wie gesagt überhaupt garkeine garantien gibt, kann man sich nichtmal drauf verlassen dass cout überhaupt aus zwei threads gleichzeitig verwendet werden darf. es ist zwar üblich dass es geht, aber naja.
-
hustbaer schrieb:
eine vernünftige implementierung wird zwar niemals "bab" ausgeben wenn ein thread << "a" macht und der andere << "bb".
Wieso das denn nicht? Wenn
coutganz innen drinputcoder Ähnliches verwendet, kann ein anderer Thread doch zwischen zwei Aufrufen sein Zeichen ausgeben.
-
TyRoXx schrieb:
hustbaer schrieb:
eine vernünftige implementierung wird zwar niemals "bab" ausgeben wenn ein thread << "a" macht und der andere << "bb".
Wieso das denn nicht? Wenn
coutganz innen drinputcoder Ähnliches verwendet, kann ein anderer Thread doch zwischen zwei Aufrufen sein Zeichen ausgeben.hustbaer schrieb:
eine vernünftige implementierung wird zwar niemals "bab" ausgeben wenn ein thread << "a" macht und der andere << "bb".
-
Ich müsste mich jetzt sehr täuschen, aber ich habe das verhalten bei MSVC++ auch schon beobachtet..
-
Microsoft schreibt bei ANSI-C (putc, printf, u.s.w.) ganz unverholen hin, das
diese Funktionen NICHT threadsafe sind.Geht ab Dual-Core auch wirklich fast immer schief.
Das es auch anders gehen könnte kann man bei UNIX (Solaris, Linux, ..) sehen.
VG
merano