O padrão POSIX 1003.1B define várias operações envolvendo semáforos, dentre as quais as mais significativas são (para mais informações vide as páginas de manual UNIX):
#include <semaphore.h> sem_t sem ; // inicializa o semáforo com o valor init_value int sem_init (sem_t *sem, int is_shared, unsigned int init_value); // P(sem) ou down(sem) int sem_wait (sem_t *sem); // V(sem) ou up(sem) int sem_post (sem_t *sem); // destroi o semáforo, liberando as tarefas bloqueadas int sem_destroy (sem_t *sem);
Usando semáforos e threads POSIX, deve ser construído um programa em C para simular uma célula flexível de manufatura. A célula é composta por tornos automáticos, robôs industriais que continuamente carregam/descarregam os tornos e buffers para a entrada e saída de peças, conforme indicado na figura abaixo.
Existem vários aspectos de sincronização a considerar:
Nesta situação, há um torno e um robô.
Nesta situação, há três tornos e dois robôs trabalhando totalmente em paralelo: qualquer robô pode carregar/descarregar qualquer torno. O restante é idêntico à situação anterior.
Para medir o desempenho das soluções propostas, sugere-se seguir o seguinte procedimento:
Desta forma, é possível medir o tempo necessário para processar N peças, e por conseqüência, a eficiência da solução implementada. Por exemplo, considerando 20 peças, 1s para cada operação de carga/descarga e 5s para cada usinagem de peça, podem ser calculados os seguintes tempos mínimos teóricos: