Will chiama select () / pselect () nel thread secondario causa thread primario di blocco?
-
12-10-2019 - |
Domanda
Ho una domanda che sto lavorando su che richiede un paio di thread secondari, e ognuno sarà responsabile di un certo numero di handle di file (almeno 1, verso l'alto di 10). Le maniglie di file non sono condivisi tra i fili, in modo da non devono preoccuparsi di un thread secondario bloccando l'altro quando select
ing di vedere ciò che è pronto a lettura / scrittura. Quello che voglio essere certi è che nessuno dei thread secondari farà sì che il thread principale per fermare l'esecuzione mentre la chiamata select
/ pselect
è in esecuzione.
Mi immagino che questo non è un problema - si potrebbe immaginare che queste cose sarebbero state fatte, per esempio, un web server - ma non ho trovato nulla che specificamente ha detto "sì, si può fare questo" quando googled. Ho ragione nel mio presupposto che questo non causerà alcun problema?
Per chiarimenti, quello che ho sembra qualcosa di simile:
-
filo principale di esecuzione (loop
select()
gestione dei messaggi di comando ricevuti e le risposte in uscita) -
thread secondario # 1 (
select()
ciclo fornire un servizio) -
thread secondario # 2 (
select()
circuito che fornisce un altro servizio)
Come ho già detto in precedenza, nessuno degli handle di file sono condivisi tra i fili -. Sono creati, usato, e distrutte entro un singolo thread, con gli altri thread ignoranti della loro esistenza
Soluzione
No you don't have to worry about them blocking the main thread. I have used select in multiple threads in various projects. As long as they have distinct FDSETS then you're fine and each one can be used like an independent event loop.
Altri suggerimenti
Isn't select supposed to block the whole process? Have you tried to set the nonblocking mode on the socket?
Also, see select_tut manpage for some help.
Here's a relevant section from the 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.