Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Eine Queue soll Threads "aufwecken"

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
03.10.2008, 16:52 Uhr
FunnyDingo



Hallo zusammen,

kurze Übersicht: ich habe zwei Threads. Beide haben Zugriff auf ein Objekt vom Typ "ipcQueue" (eine Klasse die eine FiFo zur Verfügung stellt und mit Mutex den Zugriff regelt).

Thread 1 wird mit Hilfe von pthread_cond_wait() dazu gebracht zu "schlafen" wenn sich keine Daten in der Queue befinden. Thread 2 liest Daten von einem Socket und schreibt diese in die Queue. Nun muss Thread 1 ja irgendwie mit bekommen, dass Daten in der Queue vorliegen und diese verarbeiten soll.

Meine aktuelle Idee wäre, dem Constructor der ipcQueue als Parameter einen Pointer auf pthread_cond_t von Thread 1 zu übergeben und am Ende von ipcQueue::write() den Thread 1 via pthread_cond_broadcast() "aufzuwecken".

Ich würde gerne wissen, was ihr von der Idee haltet oder ob jemand eine elegantere Lösung kennt.

Gruß,
FunnyDingo
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
03.10.2008, 19:06 Uhr
0xdeadbeef
Gott
(Operator)


Hmm...vielleicht ein Semaphor als Elementzähler?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.10.2008, 00:42 Uhr
FunnyDingo



OK, wenn ich das richtig verstanden habe, dann müsste das ganze in etwa so aussehen (ohne Fehlerhandling, Code aus dem Kopf):


C++:
template<class ipcQueueT> void ipcQueue<ipcQueueT>::read(ipcQueueT *data)
{
  pthread_mutex_lock(&mutex); // Locken, damit dataPool sauber geprüft werden kann
  if(dataPool.empty())
  {
    pthread_mutex_unlock(&mutex); // Unlocken
    sem_wait(&sem); // Hier hängen wir bis Daten vorliegen
    pthread_mutex_lock(&mutex); // locken, damit sauber gelesen werden kann
  }
  *data = dataPool.front();
  dataPool.pop_front();
  pthread_mutex_unlock(&mutex); // unlocken
}

template<class ipcQueueT> void ipcQueue<ipcQueueT>::write(ipcQueueT data)
{
  pthread_mutex_lock(&mutex); // Locken, damit sauber geschrieben werden kann
  dataPool.push_back(data);
  pthread_mutex_unlock(&mutex) // unlocken
  sem_post(&sem); // Signal geben
}


Oder habe ich da was missverstanden und fliege mit dem Code auf die Schnauze?
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.10.2008, 12:42 Uhr
0xdeadbeef
Gott
(Operator)


Ja, ziemlich genau so.

Ich würde das ganze so betrachten, dass Thread 1 von der Queue Ressourcen anfordert, und ggf. halt warten muss, bis welche da sind - und für genau solche Dinge sind Semaphore ja da. Die Queue Threads von Hand aufwecken zu lassen, halte ich hier für unnötig kompliziert - das wäre dann denkbar, wenn du Kontrolle darüber bräuchtest, welcher von x wartenden Threads beim Schreiben in die Queue aufgeweckt werden soll.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.10.2008, 17:31 Uhr
FunnyDingo




Zitat von 0xdeadbeef:
Die Queue Threads von Hand aufwecken zu lassen, halte ich hier für unnötig kompliziert - das wäre dann denkbar, wenn du Kontrolle darüber bräuchtest, welcher von x wartenden Threads beim Schreiben in die Queue aufgeweckt werden soll.


Das war mal so. Ich habe mein Model aber umgestellt, so dass ich nun nicht mehr spezifizieren muss, wer aufgeweckt werden soll. Mit dem Semaphoren passiert dies ja nun autoamtisch.

Ich danke dir für den super Tipp. Der erleicht mir vieles.
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: