Como sincronizar a inicialização de semáforos POSIX sem nome?

1

Para usar semáforos POSIX sem nome com múltiplos processos, é necessário criar / obter acesso a uma parte da memória compartilhada. Depois disso, um processo deve inicializar o semáforo chamando sem_init com uma referência à memória compartilhada como primeiro parâmetro. No entanto, isso só pode ser feito uma vez!

POSIX diz:

Attempting to initialize an already initialized semaphore results in undefined behavior.

O problema é que não há como testar se o semáforo já existe e é inicializado, e para inicializá-lo se não, de maneira atômica.

Pode-se ficar tentado a simplesmente adicionar um sinalizador booleano à memória compartilhada que indica se o semáforo já foi inicializado, mas que obviamente produz uma condição de corrida - algo que definitivamente não se deseja ao trabalhar com semáforos:)

Os semáforos XSI (também conhecidos como System V) requerem uma maneira bastante complicada de inicializar corretamente sem raças, mas pode ser seguro (veja a implementação no APUE, por exemplo). Além disso, os semáforos POSIX nomeados não mostram esse problema, pois sem_open aceita o sinal O_EXCL e também pode inicializar o valor do semáforo.

Então, como alguém pode compartilhar semáforos POSIX sem nome entre processos com segurança sem depender de outras maneiras de sincronizar ou forçar os outros processos somente após inicializar o semáforo? O que eu sinto falta?

    
por stefanct 11.11.2016 / 18:51

0 respostas