Online-Skater
Erfahrenes Mitglied
Hi Tutorianer,
habe mal eine Frage bzgl. Threadsynchronisation. Nachfolgend ein kleines Beispiel.
Ausgabe:
Ich habe im Debugger den Verlauf beobachtet , beim zurückgeben des Wertes 4 (return 4) wird erst der Destruktor ausgeführt und danach der Rückgabewert übergeben. Das bedeutet das der return Befehl unterbrochen wird um Speicher aufzuräumen also aus dem sichtbarkeitsraum usw. ist das richtig ? Das bedeutet der return Befehl ist nicht threadsicher.
Beispiel mit boost::mutex
Wäre dies threadsicher ? Zur Erläuterung die Klasse lock_guard hat nur einen Konstruktor der den Mutex locked und einen Destruktor der diesen wieder unlocked.
Alternative:
Hier ist ein wenig Mehraufwand da eine Kopie angelegt wird. Ist diese Methode ratsamer und warum ? Ich verstehe nicht ganz ob obiges Beispiel mit der Return-Unterbrechung Kompiler abhängig (Maschinenabh. oder Programmiersprachenabh. ist) Danke für Details 
habe mal eine Frage bzgl. Threadsynchronisation. Nachfolgend ein kleines Beispiel.
C++:
#include <iostream>
using namespace std;
class Test
{
public:
Test()
{
count++;
cout << count << " Konstruktor" << endl;
}
~Test()
{
cout << count << " Destruktor" << endl;
count--;
}
static int count;
};
int Test::count = 0;
int give()
{
Test t1;
return 4;
}
int main()
{
cout << "Start: " << endl;
cout << give() << endl;
cout << "Ende: " << endl;
return 0;
}
Code:
Start:
1 Konstruktor
1 Destruktor
4
Ende:
Ich habe im Debugger den Verlauf beobachtet , beim zurückgeben des Wertes 4 (return 4) wird erst der Destruktor ausgeführt und danach der Rückgabewert übergeben. Das bedeutet das der return Befehl unterbrochen wird um Speicher aufzuräumen also aus dem sichtbarkeitsraum usw. ist das richtig ? Das bedeutet der return Befehl ist nicht threadsicher.
Beispiel mit boost::mutex
C++:
boost::mutex locker;
int Val;
void setVal(int v)
{
boost::mutex::lock_guard(locker);
Val = v;
}
int getVal()
{
boost::mutex::lock_guard(locker);
return Val;
}
Wäre dies threadsicher ? Zur Erläuterung die Klasse lock_guard hat nur einen Konstruktor der den Mutex locked und einen Destruktor der diesen wieder unlocked.
Alternative:
C++:
int getVal()
{
int retVal;
locker.lock()
retVal = Val;
locker.unlock();
return retVal;
}
