`select` auf derselben fd von mehreren threads

Was passiert, wenn ich call select auf dem gleichen open file descriptor von mehreren threads?

Ist das irgendwo dokumentiert?

  • Es kann zu undefiniertem Verhalten. Nicht select auf die gleiche Datei-Deskriptoren gleichzeitig.
  • Wo ist dieser dokumentiert? (oder Woher wissen Sie das?)
  • Ist es sicher zu select zur besseren Lesbarkeit in einem thread, und select für writability in einem anderen thread?
  • veer ist falsch, es ist vollkommen legal zu rufen, wählen Sie gleichzeitig. Aber offensichtlich gibt es inhärente race-conditions, wenn beide Anrufer vermuten Operationen auf einer einzelnen Datei-Deskriptor wird nicht blockiert-nur einen thread bekommen, wird jedem einzelnen byte der Daten.
  • Darf ich wissen, was ist Ihre Anforderung, dies zu tun?
  • Ross: eine Weitere interessante Sache: manchmal gibt es eine race-condition sowieso - Z. B. wählen Sie lesbar auf einem socket bedeutet nicht, dass der client wird immer noch versucht die Verbindung herzustellen, wenn anzunehmen ist genannt, es kann also noch blockieren.
  • In älteren Kerneln war es ein problem, bezeichnet als Thundering herd. Wenn mehrere threads/Prozesse blockiert in select und einige der sockets, die bereit ist, alle Prozesse/threads aufwecken. Nur einige von Ihnen geschehen zu verarbeiten, die Bereitschaft Ereignisse auf sockets, während andere einfach eine idle-Schleife und gehen Sie zurück zu schlafen in select wieder. Auf einem ausgelasteten system könnte dies Auswirkungen auf die Gesamtleistung.
  • Dies ist ein Allgemeines problem (nicht spezifisch auswählen) im Zusammenhang mit der futex-Mechanismus zugrunde liegt, dass fast alle die synchronisierungsprimitiven. Es wurde eine neue Funktion Hinzugefügt, um futex-zu-Adresse-diese finden Sie unter man futex.
  • Alle Prozesse erhalten die Ereignisse, aber die langsameren bekommen EWOULDBLOCK, wenn Sie versuchen, die liest und die Daten schon Weg in ein schneller Prozess.

Schreibe einen Kommentar