Will chiama select () / pselect () nel thread secondario causa thread primario di blocco?

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

  •  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 selecting 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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top