o java.util.simultâneas vs.Impulsionar a biblioteca de Threads
-
20-09-2019 - |
Pergunta
Como a Impulsionar o Segmento de bibliotecas comparar com o java.util.simultâneas bibliotecas?
O desempenho é crítico e, assim, eu preferiria ficar com o C++ (apesar de Java é muito mais rápido nos dias de hoje).Considerando que eu tenho um código em C++, que as bibliotecas existem para tornar threading fácil e menos propensa a erros.
Eu ouvi recentemente que, a partir da JDK 1.5, o modelo de memória Java foi alterado para corrigir alguns problemas de simultaneidade.Como em C++?A última vez que eu fiz de programação multithread em C++ foi de 3-4 anos atrás, quando eu usei pthreads.Embora, não quero mais usar isso para um projeto de grande porte.A única outra alternativa, que eu saiba, é o Impulso de Threads.No entanto, eu não tenho certeza se ele é bom.Eu tenho ouvido coisas boas sobre java.util.simultâneas, mas nada ainda sobre o Boost threads.
Solução
Os threads de impulso são muito mais fáceis de usar do que o PTHREADS e, na minha opinião, um pouco mais fácil de usar do que os threads java. Quando um objeto Thread Boost é instanciado, ele inicia um novo thread. O usuário fornece um objeto de função ou função que será executado nesse novo thread.
É realmente tão simples quanto:
boost::thread* thr = new boost::thread(MyFunc());
thr->join();
Você pode passar facilmente dados para o encadeamento armazenando valores dentro do objeto de função. E na versão mais recente do Boost, você pode passar um número variável de argumentos para o próprio construtor de threads, que será transmitido para o seu objeto de função ()
operador.
Você também pode usar fechaduras no estilo RAII com boost::mutex
para sincronização.
Observe que C ++ 0x usará a mesma sintaxe para std::thread
.
Outras dicas
o java.util.simultâneas e impulsionar a biblioteca de threads tem uma funcionalidade de sobreposição, mas o java.util.concorrentes também oferecem um alto nível de abstração e b) também menor nível de funções.
Aumentar threads fornecer:
- Thread (Java:o java.util.Thread)
- Fecho (Java: o java.lang.Objeto e o java.util.simultâneas.bloqueios)
- Variáveis De Condição (Java. o java.lang.Objeto e o java.util.simultâneas)
- Barreira (Java: Barreira)
o java.util.concorrentes também:
- Semáforos
- Leitor-gravador de bloqueios
- Simultâneas de estruturas de dados, e.g.um BlockingQueue ou um concorrentes sem bloqueio hash mapa.
- o Executor serviços como altamente flexível consumidor produtor sistema.
- Atomic operações.
Uma nota lateral:C++ tem actualmente nenhum modelo de memória.Em uma máquina diferente da mesma aplicação C++ pode ter que lidar com um diferente modelo de memória.Isso torna portátil, simultâneas de programação em C++ ainda mais complicado.
O desempenho do sábio eu não teria realmente se preocupar.É a minha intuição de que um impulso/c++ especialista poderia escrever código mais rápido do que um especialista em java.Mas quaisquer vantagens teria que lutou para.
Eu prefiro Impulso de design de paradigmas para Java.Java é OO todo o caminho, onde Boost/C++ permite OO se você gosta, mas utiliza o paradigma útil para o problema em questão.Em particular, eu amo RAII ao lidar com os bloqueios.Java lida com o gerenciamento de memória muito bem, mas às vezes parece que o resto dos programadores recursos de obter shafted:identificadores de arquivo, exclusões mútuas, banco de dados, sockets, etc.
Java simultâneas de biblioteca é mais abrangente do que o Impulso da.Pools de threads simultâneos de contentores, atômicos, etc.Mas o núcleo primitivos estão em pé de igualdade uns com os outros, segmentos, exclusões mútuas, as variáveis de condição.
Assim, para o desempenho eu diria que é uma lavagem.Se você precisa de um monte de alto nível simultâneas biblioteca de suporte a Java wins.Se você preferir paradigma de liberdade C++.
Se o desempenho é um problema no seu programa multithread, considere um design sem bloqueio.
A trava significa que os threads não competem por um recurso compartilhado e isso minimiza os custos de comutação. Nesse departamento, Java tem uma história melhor IMHO, com suas coleções simultâneas. Você pode rapidamente encontrar uma solução sem bloqueio.
Por ter usado o thread de impulso um pouco (mas não extensivamente), posso dizer que seu pensamento será influenciado pelo que está disponível, e isso significa essencialmente uma solução de travamento.
Escrever uma solução C ++ sem bloqueio é muito difícil, devido à falta de suporte da biblioteca e também conceitualmente, porque está faltando um modelo de memória que garante que você possa escrever objetos verdadeiramente imutáveis.
Este livro é uma leitura obrigatória: Concorrência de java na prática
Se você estiver segmentando uma plataforma específica, a chamada direta do sistema operacional provavelmente será um pouco mais rápida do que usar o Boost para C ++. Eu tenderia a usar o ACE, pois você geralmente pode fazer as chamadas certas para sua plataforma principal e ela ainda será independente da plataforma. O Java deve ter a mesma velocidade, desde que você possa garantir que estará em execução em uma versão recente.
No C ++, pode -se usar diretamente o PTHRADS (pthread_create () etc), se alguém quisesse. Internamente, o Java usa o Pthreads por meio de seu ambiente de tempo de execução. Faça "LDD" para ver.