Nos primeiros dias do FORTRAN e do BASIC, essencialmente todos os programas foram escritos com instruções GOTO. O resultado foi o código espaguete e a solução foi a programação estruturada.
Da mesma forma, os ponteiros podem ter características difíceis de controlar em nossos programas. O C ++ começou com muitos ponteiros, mas o uso de referências é recomendado. Bibliotecas como STL podem reduzir parte de nossa dependência. Existem também expressões idiomáticas para criar ponteiros inteligentes com melhores características, e algumas versões do C ++ permitem referências e código gerenciado.
Práticas de programação como herança e polimorfismo usam muitos ponteiros nos bastidores (assim como, durante, a programação estruturada gera código preenchido com instruções de ramificação). Idiomas como Java eliminam ponteiros e usam a coleta de lixo para gerenciar dados alocados dinamicamente, em vez de depender dos programadores para corresponder a todas as novas e excluir instruções.
Na minha leitura, vi exemplos de programação multiprocessos e multiencadeamentos que parecem não usar semáforos. Eles usam a mesma coisa com nomes diferentes ou têm novas maneiras de estruturar a proteção de recursos contra o uso simultâneo?
Por exemplo, um exemplo específico de um sistema para programação multithread com processadores multicore é o OpenMP. Representa uma região crítica da seguinte forma, sem o uso de semáforos, que parecem não estar incluídos no ambiente.
th_id = omp_get_thread_num();
#pragma omp critical
{
cout << "Hello World from thread " << th_id << '\n';
}
Este exemplo é um trecho de: http://en.wikipedia.org/wiki/OpenMP
Como alternativa, uma proteção semelhante dos encadeamentos usando semáforos com as funções wait () e signal () pode se parecer com:
wait(sem);
th_id = get_thread_num();
cout << "Hello World from thread " << th_id << '\n';
signal(sem);
Neste exemplo, as coisas são bem simples, e apenas uma simples revisão é suficiente para mostrar que as chamadas em espera () e sinal () são correspondidas e, mesmo com muita simultaneidade, a segurança do encadeamento é fornecida. Mas outros algoritmos são mais complicados e usam vários semáforos (binários e contadores) espalhados por várias funções com condições complexas que podem ser chamadas por muitos threads. As consequências de criar um impasse ou deixar de tornar o thread seguro podem ser difíceis de gerenciar.
Esses sistemas, como o OpenMP, eliminam os problemas com semáforos?
Eles movem o problema para outro lugar?
Como transformar meu semáforo favorito usando o algoritmo para não usar mais semáforos?