Pergunta

Estou lendo dados de múltiplas portas seriais. No momento estou usando um manipulador de sinal personalizado (configurando sa_handler) para comparar e tópicos vigília com base em informações de descritor de arquivo. Eu estava procurando uma saída para ter tópicos individuais com manipuladores de sinais únicos, a este respeito, descobri que chamada de sistema select é para ser usado.

Agora eu tenho as seguintes questões:

  1. Se eu estou usando um thread (Qt), então onde posso colocar a chamada de sistema select para monitorar a porta serial?
  2. É o seleto segmento seguro chamada de sistema?
  3. É intensivo da CPU, porque há muitas coisas acontecendo em meu aplicativo, incluindo atualização GUI?

Por favor, não me importo, se você encontrar essas perguntas ridículas. Eu nunca usei um tal mecanismo para a comunicação serial.

Foi útil?

Solução

O POSIX (select) é o lugar para procurar a definição select. Eu, pessoalmente, recomendo poll -. Ele tem uma interface melhor e pode lidar com qualquer número de descritores, em vez de um limite definido pelo sistema

Se bem entendi você está a tópicos de vigília com base no estado de certos descritores. A melhor maneira seria ter cada thread tem seu próprio descritor e chamar escolha própria. Você vê, selecione não modifica o estado do sistema, e contanto que você usa variáveis ??de segmentos locais que vai ser seguro. No entanto, você definitivamente vai querer garantir que você não fechar um descritor que um fio depende.

Usando select / poll com folhas de tempo limite a "espera"-se para o lado do kernel, o que significa que o fio é geralmente posto para dormir. Enquanto o segmento está dormindo ele não está usando qualquer momento CPU. Um tempo / loop em uma chamada select sem um tempo limite, por outro lado vai lhe dar um uso de CPU superior como você está girando constantemente no loop.

Espero que isso ajude.

EDIT: Além disso, select / poll pode ter resultados imprevisíveis quando se trabalha com o mesma descritor em vários segmentos. A simples razão para isto é que o primeiro segmento pode ser acordado, porque o descritor está pronto para leitura, mas o segundo segmento tem que esperar para o próxima "disponível para a leitura de" despertar.

Enquanto você não está selecting no mesmo descritor em vários segmentos você não deve ter um problema.

Outras dicas

É uma chamada de sistema -. Deve ser thread-safe, eu acho

Eu não fiz isso antes, mas eu ficaria surpreso, se onde não. Como CPU select() intensiva é, depende, em minha opinião, em grande parte sobre o número de identificadores de arquivo que você está esperando. select() é usado, principalmente, para esperar por um número (> 1) de identificadores de arquivo para se tornar pronto.

Deve também ser mencionado que select() não deve ser usado para consultar os identificadores de arquivo - por razões de desempenho. O uso normal é: Você tem o seu trabalho feito e algum tempo pode decorrer até a próxima coisa está acontecendo. Agora você suspender o seu processo com select e deixar outro processo de execução. select() normalmente faz suspender o processo ativo. Como isso funciona em conjunto com threads, eu não tenho certeza! Gostaria de pensar, que todo o processo (e todas as threads) estão suspensos. Mas isso pode ser documentada. Ele também pode depender (em Linux) se você usar o sistema-threads ou usuário-Threads. O kernel não saberá User-Threads e, portanto, suspender todo o processo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top