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.

Foi útil?

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:

o java.util.concorrentes também:

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top