Pergunta

Gostaria de uso de semáforos POSIX para gerenciar atômica get e put de um arquivo que representa uma fila.Eu quero a flexibilidade de ter algo chamado no sistema de arquivos, de modo que completamente alheios processos podem compartilhar uma fila.Eu acho que esse plano regras pthreads.O chamado posix semáforos são ótimos para colocar algo no sistema de ficheiros que qualquer processo pode ver, mas não consigo encontrar o padrão CondWait primitivo:

... decide we have to wait ....
CondWait(sem, cond);

Quando CondWait é chamado por um processo de atomicamente postagens e sem esperas em cond.Quando algum outro processo de posts para cond, o processo de espera acorda só se pode atomicamente sem diminuir bem.A alternativa de

... decide we have to wait ....
sem_post(sem);
sem_wait(cond);
sem_wait(sem);

está sujeito a uma condição de corrida no qual alguns outros sinais de processo cond pouco antes de este processo de espera nele.

Eu quase nunca fazer qualquer programação concorrente, então eu pensei que eu ia perguntar, ENTÃO:se eu usar um padrão POSIX contagem de semáforo para a variável de condição, é possível que esta corrida é benigno?

Apenas no caso de alguém quiser o contexto maior, eu estou construindo get e put operações para um atômica fila que pode ser chamado a partir de scripts de shell.

Foi útil?

Solução

Uma vez que não há outras respostas vou seguir com o que eu aprendi:

  • Pthreads não irá funcionar com a minha candidatura, porque eu tenho de processos sem um ancestral comum que precisam compartilhar um atômica fila.
  • Semáforos Posix são assunto para a ativação de espera de corrida, mas porque ao contrário do clássico variáveis de condição eles são a contagem de semáforos, a corrida é benigna.Eu não tiver uma prova desta afirmação, mas eu já tinha um sistema em execução há dois dias e a funcionar bem.(Completamente sem sentido, eu sei, mas pelo menos isso significava que eu tenho o trabalho feito.)
  • Chamado de semáforos Posix são difícil de lixo recolher partir do sistema de arquivos.

Para resumir, chamado de semáforos Posix acabou por ser um boa base para a implementação de um atômica fila de abstração para ser compartilhado entre processos não relacionados.

Eu gostaria de ter uma prova ou uma validado SPIN modelo, mas como a minha necessidade de aplicação é limitado, parece improvável que vou escrever um.Espero que isso ajude alguém que queira uso de semáforos Posix.

Outras dicas

De acordo com Posix Padrão, o conjunto de rotinas de semáforo é:

  • sem_close ()
  • sem_destroy ()
  • sem_getValue ()
  • sem_init ()
  • sem_open ()
  • sem_post ()
  • sem_timedwait ()
  • sem_trywait ()
  • sem_unlink ()
  • sem_wait ()

o sem_trywait() e sem_timedwait() As funções podem ser o que você está procurando.

Eu sei que essa pergunta é velha, mas a solução óbvia seria utilizar apenas o processo partilhado de mutexes e variáveis de condição localizado em um arquivo que você pode mmap.

Você está procurando: pthread_cond_wait, pthread_cond_signal, eu acho.
Se você estiver usando threads POSIX, os métodos PTHread forneceriam a funcionalidade do Condwait e do sinal.
Procure aqui o código -fonte nos pTHreads multiprocessos via memória compartilhada.
http://linux.die.net/man/3/thread_mutexattr_init
Isso é para Linux, mas os documentos são posix. Eles são semelhantes ao Solaris, mas você deseja ler as páginas do seu sistema operacional.

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