É possível evitar uma corrida de despertar em espera utilizando apenas semáforos POSIX? É benigno?

votos
0

Eu gostaria de usar semáforos POSIX para gerenciar get atômica e colocar a partir de um arquivo que representa uma fila. Eu quero a flexibilidade de ter algo chamado no sistema de arquivos, de modo que completamente processos não relacionados pode compartilhar uma fila. Eu acho que este plano exclui pthreads. Os semáforos POSIX nomeados são grandes para colocar algo no sistema de arquivos que qualquer processo pode ver, mas eu não posso encontrar o CondWait padrão primitivo:

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

Quando CondWait é chamado por um processo que mensagens atomicamente para SEM e espera em cond. Quando algumas outras mensagens de processo para cond, o processo de espera acorda somente se ele puder atomicamente decrement sem também. A alternativa de

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

está sujeita a uma condição de corrida em que alguns outros sinais de processo cond pouco antes de este processo espera nele.

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

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

Publicado 10/12/2008 em 04:48
fonte usuário
Em outras línguas...                            


4 respostas

votos
2

Como não existem outras respostas eu vou seguir com o que eu aprendi:

  • Pthreads não funcionará com o meu pedido, porque eu tenho processos sem um ancestral comum que precisam compartilhar uma fila atômica.
  • Semáforos Posix são sujeitas a corrida de despertar em espera, mas porque ao contrário de variáveis de condição clássicos estão contando os semáforos , a corrida é benigno. Eu não tenho uma prova desta afirmação, mas eu tive um sistema rodando por dois dias agora e funcionando bem. (Completamente sem sentido eu sei, mas pelo menos isso significava que eu tenho o trabalho feito.)
  • Semáforos Posix nomeados são difíceis de lixo-recolher a partir do sistema de arquivos .

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

Eu gostaria de ter uma prova ou um modelo SPIN validados, mas como a minha necessidade de aplicação é limitada, parece improvável que eu vou escrever um. Espero que isso ajude alguém que pode querer usar semáforos Posix.

Respondeu 13/12/2008 em 06:13
fonte usuário

votos
0

Eu sei que esta questão é antiga, mas a solução óbvia seria a de simplesmente usar mutexes compartilhada em processos e variáveis de condição localizados em um arquivo que você pode mmap.

Respondeu 04/08/2011 em 07:44
fonte usuário

votos
0

De acordo com o 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()funções pode ser o que você está procurando.

Respondeu 20/12/2008 em 00:22
fonte usuário

votos
-1

Você está procurando: pthread_cond_wait, pthread_cond_signal, eu acho.
Isto é, se você estiver usando threads POSIX, em seguida, os métodos pthread iria fornecer a funcionalidade de CondWait e Signal.
Olhe aqui para código fonte no pthreads multiprocess via memória compartilhada.
http://linux.die.net/man/3/pthread_mutexattr_init
Isso é para Linux, mas os documentos são POSIX. Eles são semelhantes a Solaris, mas você vai querer examinar as páginas do homem no seu sistema operacional.

Respondeu 10/12/2008 em 08:48
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more