Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
fast hawk Senior JLI'ler
Anmeldedatum: 15.07.2005 Beiträge: 237 Wohnort: Freiburg Medaillen: Keine
|
Verfasst am: 02.12.2008, 18:15 Titel: Threads + Klassen |
|
|
Hi
ich hätte die Frage, ob es theoretisch möglich ist, eine Klasse von zwei verschiedenen Threads aufrufen lassen? Jedoch söllten die in der Klasse gespeicherten Variablen mit ihrem Wert erhalten bleiben.
CPP: | USockServer& USockServer::GetInstance(void)
{
static USockServer Instance;
return Instance;
} |
wenn ich die Instance als static deklanier müsste es doch gehn?
(tuts aber nicht)
ansonsten gibt es eine andere Möglichkeit die Variablen einer Klasse so definieren, dass sie auch in einem anderen Thread mit ihrem Wert erhalten bleiben?
viele grüße
f. hawk _________________ Jetziges Projekt: The Ring War
Status: 40%
-----------------------------------
Nicht weil es schwer ist, wagen wir es nicht, sondern weil wir es nicht wagen, ist es schwer.
--
Lucius Annaeus Seneca (4)
röm. Philosoph, Dramatiker und Staatsmann |
|
Nach oben |
|
|
fast hawk Senior JLI'ler
Anmeldedatum: 15.07.2005 Beiträge: 237 Wohnort: Freiburg Medaillen: Keine
|
Verfasst am: 02.12.2008, 18:22 Titel: |
|
|
hi
sry das ich euch genervt hab....
ich hab heut 2 stunden verbracht alles mögliche ausprobieren und jetzt hab ich grad gesehn, dass es schlicht und einfach daran liegt, dass die Funktion nochmal eine gleichnamige lokale Variable definiert.
trozdem danke
viele grüße
f. hawk _________________ Jetziges Projekt: The Ring War
Status: 40%
-----------------------------------
Nicht weil es schwer ist, wagen wir es nicht, sondern weil wir es nicht wagen, ist es schwer.
--
Lucius Annaeus Seneca (4)
röm. Philosoph, Dramatiker und Staatsmann |
|
Nach oben |
|
|
xardias JLI Master
Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 23.12.2008, 08:12 Titel: |
|
|
Ich hoffe du hast dich mit Threadsynchronisierung und Critical Sections beschäftigt, sonst kriegst du da ganz schnell ganz ekelige Fehler
Zwei Threads dürfen nicht gleichzeitig auf die selben Datenstrukturen zugreifen, solche parallelen Zugriffe müssen synchronisiert werden. |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 23.12.2008, 09:14 Titel: |
|
|
xardias hat Folgendes geschrieben: |
Zwei Threads dürfen nicht gleichzeitig auf die selben Datenstrukturen zugreifen, solche parallelen Zugriffe müssen synchronisiert werden. |
Doch dürfen sie. Zumindest wenn beide Threads nur lesen gibts keine Probleme. |
|
Nach oben |
|
|
Dragon Super JLI'ler
Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
Verfasst am: 23.12.2008, 12:02 Titel: |
|
|
Du kannst für deine Klasse eine Lock und Unlock-Funktion schreiben. Immer wenn ein Thread ändernd auf die Klasse zugreift, muss sie vorher gelockt werden. Aber nicht das unlocken vergessen. Es könnte dann so aussehen:
Thread 1:
CPP: | Klasse::getInstance().lock();
Klasse::getInstance().setBla(blub);
Klasse::getInstance().macheWas();
Klasse::getInstance().macheNochwas();
Klasse::getInstance().unlock(); |
Thread 2:
CPP: | Klasse::getInstance().lock();
Klasse::getInstance().setBlub(blubblub);
Klasse::getInstance().macheWasWichtiges();
Klasse::getInstance().setFoo(foomilch);
Klasse::getInstance().unlock(); |
Edit: Vieleicht schreibe ich heute Abend noch etwas dazu. Habe das schonmal programmiert gehabt. _________________ Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 23.12.2008, 15:48 Titel: |
|
|
Wenn eine der Aktionen vor dem unlock eine Exception wirft kann es aber passieren das die Klasse gelockt bleibt. Daher würde ich lieber, eine LockKlasse empfehlen:
CPP: | class LockClass
{
public:
LockClass(ILockable& Lockable)
: m_Lockable(&Lockable)
{
m_Lockable->Lock();
}
~LockClass()
{
m_Lockable->Unlock();
}
}; |
CPP: | class myClass : public ILockable
{
...
}; |
Thread1:
CPP: | LockClass myLock(*(ILockable*)myClassInstance);
myClassInstance->setBla(blub);
myClassInstance->macheWas();
myClassInstance->macheNochwas(); |
Thread2:
CPP: | LockClass myLock(*(ILockable*)myClassInstance);
myClassInstance->setBla(blub);
myClassInstance->macheWasWichtiges();
myClassInstance->setFoo(foomilch); |
Der Destruktor wird aufgerufen sobald der Scope verlassen wird in dem die LockKlasse erstellt wurde. |
|
Nach oben |
|
|
xardias JLI Master
Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 23.12.2008, 18:04 Titel: |
|
|
David hat Folgendes geschrieben: | xardias hat Folgendes geschrieben: |
Zwei Threads dürfen nicht gleichzeitig auf die selben Datenstrukturen zugreifen, solche parallelen Zugriffe müssen synchronisiert werden. |
Doch dürfen sie. Zumindest wenn beide Threads nur lesen gibts keine Probleme. |
Entschuldige, du hast natürlich recht. Ich war grad ein bisl Faul und wollte das nicht genauer ausführen. |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 23.12.2008, 19:50 Titel: |
|
|
@Fallen:
Statt dem Interface könnte man aus dem Scopeguard auch ein Template machen. Gibt ja Leute die mögen z.B. keine Mehrfachvererbung. Außerdem kann das Template kopiergeschützt gemacht werden.
CPP: | template< typename T >
class ScopedLock
{
public:
ScopedLock( T& locked ) : m_pLocked( locked )
{
m_pLocked.Lock();
}
ScopedLock( T* locked ) : m_pLocked( *locked )
{
m_pLocked.Lock();
}
~ScopedLock()
{
m_pLocked.Unlock();
}
private:
// not copyable
ScopedLock( const ScopedLock& );
ScopedLock& operator=( const ScopedLock& );
T& m_pLocked;
}; |
|
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 23.12.2008, 21:28 Titel: |
|
|
Stimmt, guter Punkt |
|
Nach oben |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 24.12.2008, 11:22 Titel: |
|
|
Da sich Viele auf in desem Forum gut mit Multithreading auskennen, könnte doch mal jemand an dem Tutorial weiterschreiben und solche Sachen wie Threadsynchronisieren ider Threadsicherheit näher erleutern. |
|
Nach oben |
|
|
|