2016-04-19 9 views
0

Unser Professor hat uns diesen Code in der Klasse:Was ist der Zweck von Pthread und der Funktion select()?

st = select(max+1, &rs, NULL, NULL, &timeinterval); 

if(st){ 
     for(int i=0; i<workers; i++) 
     { 

      if(FD_ISSET(channels[i]->read_fd(), &rs)) 

und ich habe ehrlich gesagt eine harte Zeit, es tut versuchen zu verstehen, was passiert. Ich habe versucht, mehr über Pthreads zu erforschen, aber nichts scheint zu erklären, was das tut. Er sagt, es hat etwas mit Dateideskriptoren zu tun, aber ich verstehe nicht, wie das in diesem Code ist.

+1

'select' ist nicht von Natur aus mit Pthreads verbunden. Ohne Kontext ist es nicht klar, worauf sich Ihr Professor bezieht und damit nicht klar, was Sie fragen. Wenn Sie wissen wollen, was 'select' macht, dann ist der Ort, an dem Sie anfangen sollen, die [select man page] (http://linux.die.net/man/2/select). – kaylum

+0

Er bringt uns bei, einen einzigen Event-Handler-Thread zu verwenden, um alle Kanäle für die Datenkommunikation mit dem Server zu verwalten. Anstatt Worker-Threads für die Bearbeitung von Einzelanfragen zu verwenden, möchte er, dass wir mehr über Ereignishandler erfahren und den Thread-Verwaltungsaufwand reduzieren. Danke auch für den Link! Ich brauche nur Hilfe zu verstehen, was dieser Code genau macht – Teflondre

+0

Und wie wäre es mit der Manpage? Hat diese Hilfe gelesen? Wenn nicht, welchen Teil hast du nicht verstanden? Zusammenfassend können Sie mit 'select' mehrere Dateideskriptoren für definierte Ereignisse betrachten. Wenn eines dieser Ereignisse auftritt (z. B. eine Eingabe, die auf einem der fds verfügbar ist), wird die Auswahl aufgehoben und der fd-Satz kann untersucht werden, um zu sehen, welcher fd ein Ereignis hat. – kaylum

Antwort

2

Der Zweck dieser select ist auf mehrere Dateideskriptoren warten, mit einer möglichen Zeitüberschreitung, wenn es mit einer positiven Zahl zurückkehrt, das heißt, mindestens ein fd im rs Set wird zum Lesen bereit, so dass in einem Schleife, Sie überprüfen, welche fd ist es, und führt lesen auf es.

Hinweis, sollten Sie für größer als 0 statt überprüfen, da -1 wird im Fehlerfall zurückgeführt werden, die Sie nicht die fd_set überprüfen sollten, aber den Fehler behandeln:

if(st > 0) { 
    for(int i=0; i<workers; i++) 
    { 
     if(FD_ISSET(channels[i]->read_fd(), &rs)) { 
      // perform read on channels[i]->read_fd 
     } 
    } 
} else if (st == 0) { 
    // handle time out 
} else { 
    // handle error 
}