JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=2f1d4d08c290c0002cb429dab45e23a9Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Threads + Klassen

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
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

BeitragVerfasst am: 02.12.2008, 18:15    Titel: Threads + Klassen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
fast hawk
Senior JLI'ler



Anmeldedatum: 15.07.2005
Beiträge: 237
Wohnort: Freiburg
Medaillen: Keine

BeitragVerfasst am: 02.12.2008, 18:22    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
xardias
JLI Master


Alter: 37
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 23.12.2008, 08:12    Titel: Antworten mit Zitat

Ich hoffe du hast dich mit Threadsynchronisierung und Critical Sections beschäftigt, sonst kriegst du da ganz schnell ganz ekelige Fehler Wink

Zwei Threads dürfen nicht gleichzeitig auf die selben Datenstrukturen zugreifen, solche parallelen Zugriffe müssen synchronisiert werden.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
David
Super JLI'ler


Alter: 38
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 23.12.2008, 09:14    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Dragon
Super JLI'ler


Alter: 37
Anmeldedatum: 24.05.2004
Beiträge: 340
Wohnort: Sachsen
Medaillen: Keine

BeitragVerfasst am: 23.12.2008, 12:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 23.12.2008, 15:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
xardias
JLI Master


Alter: 37
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 23.12.2008, 18:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
David
Super JLI'ler


Alter: 38
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 23.12.2008, 19:50    Titel: Antworten mit Zitat

@Fallen:

Statt dem Interface könnte man aus dem Scopeguard auch ein Template machen. Gibt ja Leute die mögen z.B. keine Mehrfachvererbung. Wink 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
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 23.12.2008, 21:28    Titel: Antworten mit Zitat

Stimmt, guter Punkt Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


Alter: 35
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 24.12.2008, 11:22    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum