Estão enfiando questões para C / C ++ “programadores de nível de sistema” significativamente diferentes daqueles enfrentados por programadores Java?
-
22-07-2019 - |
Pergunta
Eu estou procurando um trabalho de desenvolvimento e ver que muitas listas especificar que os desenvolvedores devem ser versados ??em multithreading. Isto parece tanto para listas de trabalho Java e para listagens de C ++ que envolvem "programação do sistema" no UNIX.
Nos últimos anos, tenho vindo a trabalhar com Java e usando seus vários mecanismos de sincronização.
No final dos anos 90 eu fiz um monte de trabalho C ++, embora muito pouco threads. Na faculdade, no entanto, usamos tópicos no Solaris.
A minha pergunta é se há diferenças significativas nos problemas que os desenvolvedores em rosto C / C ++ em comparação com os desenvolvedores em Java, e se qualquer uma das técnicas para resolvê-los são fundamentalmente diferentes. Java inclui, obviamente, alguns mecanismos mais agradáveis ??e versões sincronizados de coleções, etc.
Se eu quiser atualizar ou enfiar reaprender no UNIX, qual é a melhor abordagem? Qual biblioteca eu deveria olhar? etc. Existe alguma grande tutorial atuais sobre tópicos em c ++?
Solução
Os desafios fundamentais de segmentação (por exemplo, sincronização, condições de corrida, comunicação inter-thread, limpeza de recursos), mas Java faz fio muito mais gerenciável com coleta de lixo, exceções, objetos de sincronização avançadas, suporte a depuração avançado com reflexão.
Com C ++, você é muito mais propensos a ter corrupção de memória e condições de corrida "impossíveis". E você terá que escrever muito mais primitivas fio de baixo nível ou depender de bibliotecas (como impulso) que não fazem parte da linguagem padronizada.
Outras dicas
C ++ é realmente aeasier escrever código rosca complexo do que Java, porque ele tem um recurso Java carece - RAII ou "aquisição de recurso é inicialização". Esta expressão é usada para todos todo o controle de recursos em código C ++ bem escrito, mas é particularmente apropriado no código multi-thread onde a gestão automática de sincronização é uma obrigação.
A coleta de lixo faz tópicos que não vazamento de memória mais fácil de programação, e há fantasia coisas você pode fazer para resolver o calendário das coleções.
destruidores determinísticos fazem tópicos que fazem zumbis não desova mais fácil programação, consulte papel ACM aqui
Depende do que o nível que você escolher para trabalhar. Intel TBB e OpenMP lidar com um monte de casos comuns de um nível elevado bonita. threads POSIX, o Windows APIs e bibliotecas portáteis como tópicos impulso aproximá-lo ao mesmo nível como primitivos em Java.
C ++ 0x enfiando (especialmente com barreiras adquirir e memória release) permitem que você vá para um nível ainda mais baixo para mais controle e complexidade de ofertas Java (marcando uma volatile
variável em Java dá tanto uma aquisição e uma memória de liberação barreira, mas em Java você não pode pedir apenas o adquirir ou apenas a barreira de libertação;. onde em C ++ 0x você pode)
Por favor note que modelo de segmentação de C ++ 0x é intencionalmente baixo nível com a esperança de que as pessoas vão construir coisas como TBB em cima dela e da próxima vez que o comitê de padrões atende eles vão ser capazes de descobrir qual daqueles maior bibliotecas e ferramentas de nível funcionam bem o suficiente para aprender.
Independentemente da linguagem de programação usos, a idiossincrasia de fio são comuns. Por exemplo, mesmo em todo OS as threads POSIX e tópicos Win32 têm mesmo conjunto de idiossincrasias lógicas, embora as chamadas de API e WRT implementação nativa subjacente hardware / kernel pode mudar, mas para programadores de sistema do pensamento lógico sobre tópicos e como fazê-los funcionar como esperado e em alcançar esta é a parte mais mais difícil. Isto é verdade mesmo quando chegar a linguagens de programação. Se você realmente entender o conceito de sincronização de threading & tópico que você é bom para ir e usá-los em qualquer linguagem de programação que você gosta. Uma vez que estas linguagens de programação fornecem açúcares sintáticos em cima da execução de sincronização de thread / thread nativa.