Events unter Linux

Gast #3897475
Lesenswert?

Hallo,

wie realisiere ich etwas wie Events (overlapped) unter Windows in Linux?
Ich muss mir eine Funktion bauen in der ein Timeoutwert übergeben wird, 
spätestens nach diesem Timeoutwert soll die Funktion zurückkehren, es 
sei denn das Ereignis tritt vorher ein. In Windows gibt es dazu die API 
Funktion WaitForSingleObject. Gibt es ein Pendant unter Windows?

Stefan
Gast #3897502
Lesenswert?

Unter Linux; es geht um Threads. Ich habe einen Thread der Daten 
häppchenweise von einer seriellen Schnittstelle sammelt. Unter 
bestimmten Voraussetzungen soll in diesem Thread ein Event gesetzt 
werden, auf das in der besagten Funktion gewartet werden soll. Im 
Windowsslang würde ich im Empfangsthread bei Bedarf ein SetEvent 
aufrufen, und in der Abfragefunktion WaitForSingleObject mit dem 
Timeout...

Stefan
Gast #3897506
Lesenswert?

Stefan schrieb:
> Unter Linux; es geht um Threads. Ich habe einen Thread der Daten
> häppchenweise von einer seriellen Schnittstelle sammelt. Unter
> bestimmten Voraussetzungen soll in diesem Thread ein Event gesetzt
> werden, auf das in der besagten Funktion gewartet werden soll. Im
> Windowsslang würde ich im Empfangsthread bei Bedarf ein SetEvent
> aufrufen, und in der Abfragefunktion WaitForSingleObject mit dem
> Timeout...

Events gibt es so unter Linux nicht. Da musst du dir etwas mit mutex und 
pthread_cond_wait basteln.
Gast #3897535
Lesenswert?

Dr. Sommer schrieb:
> Verwende nicht blockierendes I/O (fcntl (), F_SETFL, O_NONBLOCKING) und
> select() zum senden/empfangen. Da kannst du dann ein Timeout angeben,
> nach dem select() immer zurückkehrt.

hilft ihm aber nicht weiter. Er will ja im Thread Daten sammeln und dann 
das einen anderen Threads wecken.
Gast #3897545
Lesenswert?

>Da kannst du dann ein Timeout angeben,
>nach dem select() immer zurückkehrt

Das "Event" soll aber eben noch nicht durch den eigentlichen 
Datenempfang auf der Schnittstelle gesetzt werden, eventuell müssen 
mehrere "Pakete" eintreffen und noch ein CRC Check gültig sein. Mit 
anderen Worten muss ich das "Event" selber programmatisch auslösen 
können.
Gast #3897561
Lesenswert?

Peter II schrieb:
> hilft ihm aber nicht weiter. Er will ja im Thread Daten sammeln und dann
> das einen anderen Threads wecken.

Ach tatsächlich. Statt events verwendet man unter UNIX pipes; der eine 
Thread sendet einfach dem anderen ein Zeichen darüber wenn er aufwecken 
soll, und dieser reagiert per select() auf das pipe.
Gast #3897567
Lesenswert?

Dr. Sommer schrieb:
> der eine
> Thread sendet einfach dem anderen ein Zeichen darüber wenn er aufwecken
> soll, und dieser reagiert per select() auf das pipe.

Dafür eine Pipe verwenden ist schon etwas viel Overhead.

es gibt dafür ja schon pthread_cond_wait, das ganze muss man nur mit 
einem Mutex kombinieren.
Gast #3897574
Lesenswert?

Alles klar, die pthread_cond_wait Sache sieht doch brauchbar aus. Warum 
man dafür zusätzlich einen Mutex braucht habe ich auf Anhieb nicht ganz 
verstanden, habe aber gesehen dass es genau zu diesem Thema einige 
Artikel gibt...

Vielen Dank!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren