Wird Aufruf select () / pSelect () in Sekundärgewinde Ursache primären Thread zu blockieren?

StackOverflow https://stackoverflow.com/questions/4504377

  •  12-10-2019
  •  | 
  •  

Frage

ich eine Anwendung, die ich auf, dass ich arbeite ein paar sekundären Threads erfordert, und jeder wird für eine Reihe von Datei-Handles (mindestens 1, nach oben von 10) verantwortlich. Die Datei-Handles sind nicht unter den Threads gemeinsam genutzt, so dass ich über einen sekundären Thread zu Sorge haben nicht die anderen blockieren kann, wenn selecting zu sehen, was bereit ist, zu lesen / schreiben. Was ich will, um sicher zu sein, ist, dass weder der sekundären Threads des Haupt-Thread verursacht die Ausführung zu stoppen, während der select / pselect Aufruf ausgeführt wird.

Ich könnte mir vorstellen, dass dies kein Problem ist - würde man sich vorstellen, dass solche Dinge würden in, sagen wir, einem Web-Server durchgeführt werden - aber ich konnte nichts finden, dass ausdrücklich gesagt: „Ja, Sie können dies tun,“ wenn ich gegoogelt. Bin ich in meiner Annahme richtig, dass dies keine Probleme verursachen?

Zur Klarstellung, was ich habe, sieht ungefähr so ??aus:

  • Haupt-Thread der Ausführung (select() Schleifenhandhabungs eingehende Kommandomeldungen und abgehende Erwiderungen)

  • Sekundärgewinde # 1 (select() Schleife Bereitstellung eines Dienstes)

  • Sekundärgewinde # 2 (select() Schleife einen anderen Dienst bereitstellt)

Wie ich bereits erwähnt, keine des Datei-Handles ist unter den Threads gemeinsam genutzt -. Sie erstellt werden, verwendet und zerstörte innerhalb eines einzelnen Thread, mit den anderen Threads nichts von ihrer Existenz

War es hilfreich?

Lösung

Nein, Sie müssen sich keine Sorgen machen über sie den Haupt-Thread zu blockieren. Ich habe in mehreren Threads in verschiedenen Projekten wählen verwendet. Solange sie verschiedene FDSETS haben, dann sind Sie feine und jeder kann wie eine unabhängige Ereignisschleife verwendet werden.

Andere Tipps

Ist das nicht wählen soll, den gesamten Prozess blockieren? Haben Sie die nicht blockierenden Modus auf dem Sockel zu setzen versucht?

Auch hierzu finden Sie select_tut manpage für etwas Hilfe.

Hier ist ein entsprechender Abschnitt aus dem select_tut manpage:

So what is the point of select()? Can't I just read and write to my descriptors whenever I want? The point of select() is that it watches multiple descriptors at the same time and properly puts the process to sleep if there is no activity.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top