Domanda

Sto leggendo i dati da più porte seriali.Al momento sto utilizzando un gestore di segnali personalizzato (impostando sa_handler) per confrontare e riattivare i thread in base alle informazioni sul descrittore di file.Stavo cercando una via d'uscita per avere thread individuali con gestori di segnali univoci, a questo proposito ho scoperto che è necessario utilizzare la chiamata di sistema select.

Ora ho le seguenti domande:

  1. Se sto utilizzando un thread (Qt), dove inserisco la chiamata di sistema select per monitorare la porta seriale?
  2. Il thread di chiamata di sistema selezionato è sicuro?
  3. Richiede un utilizzo intensivo della CPU perché nella mia app accadono molte cose, incluso l'aggiornamento della GUI?

Per favore, non preoccuparti se trovi queste domande ridicole.Non ho mai usato un meccanismo del genere per la comunicazione seriale.

È stato utile?

Soluzione

La specifica POSIX (seleziona) è il posto dove cercare la select definizione. Personalmente consiglio poll - ha un'interfaccia migliore e può gestire un numero qualsiasi di descrittori, piuttosto che un limite definito dal sistema.

Se ho capito bene stai riattivando i thread in base allo stato di alcuni descrittori. Un modo migliore sarebbe quello di avere ogni thread con il proprio descrittore e chiamare selezionare se stesso. Vedete, selezionare non modifica lo stato del sistema e finché si utilizzano le variabili thread-local sarà sicuro. Tuttavia, vorrai sicuramente assicurarti di non chiudere un descrittore da cui dipende un thread.

L'uso di <=> / <=> con un timeout lascia il " in attesa " fino al lato del kernel, il che significa che il thread viene di solito messo in sleep. Mentre il thread è inattivo, non utilizza alcun tempo della CPU. Un ciclo while / for su una <=> chiamata senza timeout d'altra parte ti darà un maggiore utilizzo della CPU mentre giri costantemente nel ciclo.

Spero che questo aiuti.

EDIT: Inoltre, <=> / <=> può avere risultati imprevedibili quando si lavora con il descrittore stesso in più thread. La semplice ragione di ciò è che il primo thread potrebbe essere risvegliato perché il descrittore è pronto per la lettura, ma il secondo thread deve attendere il prossimo & Quot; disponibile per la lettura " sveglia.

Fintanto che non stai <=> inserendo lo stesso descrittore in più thread, non dovresti avere problemi.

Altri suggerimenti

È una chiamata di sistema: dovrebbe essere thread-safe, credo.

Non l'ho fatto prima, ma sarei piuttosto sorpreso se così non fosse.Quanto è intensivo la CPU select() dipende, a mio avviso, in gran parte dal numero di file handle che stai aspettando. select() viene utilizzato principalmente per attendere che un numero (>1) di handle di file diventi pronto.

Va menzionato anche questo select() non dovrebbe essere utilizzato per interrogare gli handle di file, per motivi di prestazioni.L'utilizzo normale è:Hai finito il tuo lavoro e può trascorrere del tempo prima che succeda la cosa successiva.Ora sospendi il processo con select e lascia che venga eseguito un altro processo. select() normalmente sospende il processo attivo.Come funzioni insieme ai thread, non ne sono sicuro!Penserei che l'intero processo (e tutti i thread) siano sospesi.Ma questo potrebbe essere documentato.Potrebbe anche dipendere (su Linux) se si utilizzano thread di sistema o thread utente.Il kernel non riconoscerà i thread utente e quindi sospenderà l'intero processo.

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