Que idéias falsas existem que afastam as pessoas do uso de threads? [fechadas]

12

Implementar o encadeamento em um programa é difícil, sim, no entanto, por que algumas pessoas não o implementam, mesmo quando há uma necessidade óbvia?

Um exemplo: o programa precisa carregar um conjunto de dados de um banco de dados, o que você deve fazer é fazer a conexão e obter os dados do banco de dados em um encadeamento de trabalho e carregá-lo na GUI, deixando o encadeamento da GUI responsivo para o usuário .

Mas não, conversei com pessoas que parecem pensar que os fios são maus e ruins e outros enfeites, e devemos evitá-los a todo custo. Eu até ouvi dizer que algum instrutor da classe desaconselhava o uso de threads e, portanto, não queria cobrir seu uso. O QUE???

Com o hardware entrando em vários núcleos, acho que precisamos entender melhor os threads e não ter medo de usá-los. Acho pessoalmente um assunto fascinante.

Então, quais são as coisas que você ouviu sobre a segmentação que são falsas?

Tony o leão
fonte
Desajustados e fracassados ​​não podem lidar com threads. A verdadeira questão é: o que você vai fazer sobre isso?
3
Essas não são idéias falsas, mas os tópicos devem sempre ser evitados. Faça sua arquitetura corretamente para que o suporte de encadeamento tenha sido tratado corretamente e nem todos os programadores precisam fazer isso sozinhos. Uma vez que os programadores aprendam a adicionar um thread em todas as situações, você terá grandes problemas.
tp1 3/02/12
Deixe-me voltar a questão para você. Você já se perguntou se existem abordagens alternativas para explorar os recursos de processamento paralelo? Ou você simplesmente pulou direto para a segmentação porque algum white paper disse isso, ou talvez porque é isso que os melhores programadores pareciam achar legal? Pessoalmente, gosto da ideia de processos leves que passam mensagens muito melhor do que threads. Eu sou preguiçoso / estúpido / com pressa? Sim, e todos nós somos, em vários graus.
user1172763

Respostas:

19

Rosquear é difícil

Certo. Pode ser. No entanto, as pessoas têm essa ideia na cabeça que é tão difícil, de modo que não se incomodam em tentar descobrir.

Não é impossível.

Steven Evers
fonte
2
Eu apoio esta resposta. As pessoas acham que é difícil. No entanto, não é quando você gasta tempo suficiente tentando entender.
11
@ Pierre, eu esperaria que muitas pessoas definissem difícil como "você tem que gastar tempo suficiente tentando entender".
Benjol
1
Enfiar está começando a ser muito mais fácil com TPL e await/ asyncpalavras-chave :)
Rachel
@ Pierre 303: Quando você gasta tempo suficiente para entender, ainda é difícil e, de fato, as pessoas que entendem melhor têm maior probabilidade de evitá-lo o máximo possível.
Michael Borgwardt
9

Não é difícil a parte do encadeamento, mas a necessidade de sincronização e tudo o mais que vem com o uso de threads. No seu exemplo de GUI, como você informa o thread principal que o conjunto de dados está pronto para ser acessado? Você repassa um monte de retornos de chamada? Você espalha um monte de variáveis ​​de verificação por todo o seu código? Em alguns modelos de GUI, por exemplo, Silverlight, existe algo chamado afinidade de encadeamento, o que significa que você não pode acessar elementos da GUI localizados no encadeamento principal a partir de outros encadeamentos, portanto, é necessário sair do seu caminho para permitir que o encadeamento principal saiba que certas informações estão disponíveis. pronto para ser processado posteriormente.

Eu realmente não ouvi nenhuma coisa falsa sobre tópicos. Acabei de ler um monte de estudos de caso situacionais sobre a sincronização ser uma chatice quando qualquer algoritmo que você está usando não é inerentemente paralelo.

davidk01
fonte
Nota para self: escreva algoritmos paralelos ... obrigado.
Droogans
Filas de mensagens (iguais às do MFC). No entanto, fazer com que os programadores não sabotem a fila de mensagens (compartilhando dados diretamente na memória), mesmo quando é uma ofensa passível de incêndio, parece ter falhado.
Rdong #
3

Rosqueamento resolve todos os seus problemas

Se você está tendo problemas de desempenho você deve não ir direto para threading.

As linhas são leves

Os segmentos são leves em dezenas e vinte anos. Gerar milhares de threads não é.

Rosquear é fácil [Java]

É fácil criar threads, isso não significa que você se beneficiará disso.

Josh K
fonte
Apenas para constar, o Mac OS não permitirá que você (em uma instalação padrão) crie mais de 512 threads.
zneak
1
Isso realmente depende do seu idioma. Gerar 1 milhão de threads em Erlang é quase imperceptível, mesmo em um laptop antigo, quanto mais em um servidor moderno. E, na verdade, eles não são apenas threads, são processos completos , ou seja, muito mais pesados que os threads. Além de seu próprio contador de programa e pilha de chamadas (que são praticamente as únicas coisas que um encadeamento possui), eles também têm seu próprio heap e até seu próprio coletor de lixo.
Jörg W Mittag
4
@ Jörg W Mittag: Estou confuso com o seu comentário. Como erlang muda a maneira como o sistema operacional cria um encadeamento ou processo?
Steven Evers
1
@SnOrfus: Erlang não usa threads do SO. Atualmente, existem três implementações principais do Erlang: BEAM, HiPE e Erjang. BEAM e HiPE são implementações nativas (que podem ser executadas sem qualquer sistema operacional) e implementam seus próprios processos. Erjang é executado na JVM e implementa processos usando a biblioteca Kilim incrivelmente brilhante.
Jörg W Mittag
@ Jörg W Mittag: Considerando minha pergunta programmers.stackexchange.com/questions/28453/… , acho isso muito interessante. Obrigado.
Steven Evers
1

Você acabará perdendo quaisquer ganhos com o encadeamento, pois a correção de erros malucos que surgirão do uso de algumas bibliotecas / funções que não são seguras para threads (do que você não estava ciente) exigirá sincronização excessiva.

Você tem uma probabilidade muito maior de encontrar um bug que não poderá consertar se usar os threads quando não o fizer.

Kamil Szot
fonte
Bugs não corrigíveis? Eu não vi um desses antes ..
adamk
Você realmente nunca viu um bug que não pôde corrigir? A tempo e pelo pagamento que estava disponível?
Kamil Szot
Se você nunca encontrou um bug não corrigível, não está na indústria há tempo suficiente. Nos meus 12 anos de trabalho, todo projeto que eu já vi tem pelo menos um bug que ninguém corrigiu e ninguém sabe como consertar ou mesmo reproduzir. Isso inclui o código no qual eu trabalhei e o código que tenho acesso para ler (código-fonte aberto). Os únicos softwares livres de erros são aqueles com menos de 2 ou 3 páginas. Mas fazer todo o seu código com 1 ou 2 páginas não resolve completamente nada, porque você tem bugs de integração.
slebetman
1

Para resumir em detalhes por que os threads são difíceis de usar: -
Coisas Verdadeiras 1) Precisa da sincronização e decisões cuidadosas sobre o que bloquear e quando bloquear
2) Nenhum controle sobre o fluxo do tempo de execução
3) Depuração difícil
4) (Muito poucas vezes) compatibilidade de plataforma: - Existem bibliotecas para cuidar disso

Coisas falsas: -
1) Conceitos confusos de funções seguras e re-entrantes de
tópicos 2) Os tópicos ficam bem no papel, mas são muito difíceis de implementar

Manoj R
fonte
Eles deveriam ser verdadeiros ou falsos? O OP perguntou sobre o que não é verdade e afasta as pessoas da programação multithread.
Steven Evers
na verdade, você não precisa de bloqueios ou sincronização. Existem também modelos de passagem de mensagens (por exemplo, erlang, scala) e modelos STM (por exemplo, clojure). Além disso, existem estruturas de dados seguras de encadeamento que não precisam de bloqueios (ConcurrentHashMap em java) e primitivas atômicas que não exigem bloqueios.
Kevin
1

Se você não quiser escrever testes para o seu código, não use threads.

Os threads não são para o programador típico de copiar e colar que não entende os fundamentos subjacentes do SO e da arquitetura do computador. Como 90% dos programadores estão familiarizados apenas com Java, essas realmente não são as pessoas que deveriam usar threads. Java torna os threads "fáceis", mas já vi muitos programadores que acham que, se usassem estruturas sincronizadas, seu código funcionaria em threads .... uhm não.

Dito isto, todo mundo precisa começar em algum lugar, apenas não faça seu primeiro projeto de encadeamento atualizando o servidor de back-end de produção da empresa.

cmcginty
fonte
Você pode recomendar alguns recursos sobre como fazer threads corretamente?
31416 Jonathan
Tenho certeza que isso foi resolvido. Tente começar aqui stackoverflow.com/questions/660621/threading-best-practices
cmcginty
O problema é que, mesmo se você tiver 100% de cobertura de teste, não terá como saber se os testes cobrirão todos os problemas possíveis com a forma como as instruções se intercalam com os recursos compartilhados. Por outro lado, com uma arquitetura de nada compartilhada, torna-se muito mais fácil.
Zachary K
1

Um exemplo: o programa precisa carregar um conjunto de dados de um banco de dados, o que você deve fazer é fazer a conexão e obter os dados do banco de dados em um encadeamento de trabalho e carregá-lo na GUI, deixando o encadeamento da GUI responsivo para o usuário .

Não vejo que essa situação represente a necessidade de usar a segmentação por pelo menos quatro razões:

  1. A recuperação de dados deve ser muito rápida.

  2. Em muitos aplicativos da Linha de negócios, o usuário não tem nada a ver com o aplicativo em um ou dois segundos em que está aguardando o resultado. Além disso, o usuário terá que esperar até que os dados retornem para concluir a tarefa desejada. A consulta, por outro lado, pode ser codificada de forma inteligente, de forma que recupere apenas uma página cheia de informações por vez e outras técnicas de otimização podem ajudar no tempo de resposta.

  3. Nas interfaces baseadas na Web, os links podem ser ativados em relação ao modelo de segmentação.

  4. A segmentação adiciona complexidade conforme você admite, alguns desenvolvedores abaixo da linha podem não conseguir adicionar recursos ou depurar códigos complexos.

Minha opinião é: use o encadeamento quando necessário, porque a manutenção e a confiabilidade do software são mais valiosas para uma organização do que a elegância do código.

NoChance
fonte
1
Seu primeiro ponto me lembra as falácias da computação distribuída ( en.wikipedia.org/wiki/Fallacies_of_Distributed_Computing ). Muitos usuários podem começar a clicar descontroladamente quando precisam esperar mais de 1 ou 2 segundos do ponto 2 por uma interface sem resposta, piorando as coisas.
Secure
@ Seguro, o link é interessante, obrigado por compartilhá-lo. Não sei se poderíamos capturar o foco do usuário o tempo todo na interface ou mesmo em todo o trabalho nos dias de hoje. Concordo com você que, nos sites de comércio eletrônico, você não deseja que o usuário desapareça.
NoChance
Eu não estou falando sobre o foco. Quando o usuário clica em um botão e a interface apenas congela porque o banco de dados é consultado, sem alguma resposta visual de que algo foi feito, alguns usuários tentam clicar no botão novamente. E de novo. Em seguida, tente clicar em outros botões ou opções. Já vi administradores fazendo isso, que deveriam saber melhor.
Secure
Pior ainda quando a tela de resultado é desenhada pela primeira vez, mas mostrada vazia. Não conheço a maioria das versões atuais, mas o resultado da pesquisa em Outlooks antigos é um bom exemplo ruim. Ao iniciar a pesquisa, ele mostra "O conjunto de resultados está vazio" ou algo assim, por alguns segundos com uma grande base de pesquisa, mostrando os primeiros resultados quando encontrados. Se você está muito impaciente ou com pressa, já mudou para a próxima pasta, acreditando que não há nada lá.
Secure
1
@ Seguro, entendo o seu ponto. O que você está descrevendo aqui mostra um bom exemplo de uma interface de usuário inconsistente. O que você descreveu também ocorre quando você pesquisa arquivos. Mas qual é a resposta para isso, além de dizer ao usuário que a pesquisa já começou?
NoChance