Alguém pode sugerir um projeto para mim escrever para me ajudar a entender a segmentação


13

Atualmente, sou um desenvolvedor de C # com uma compreensão bastante instável do encadeamento.

Ambos os links foram sugeridos em outros posts:

http://www.yoda.arachsys.com/csharp/threads/

http://www.albahari.com/threading/

Devo voltar ao básico e talvez examinar alguns textos de ciência da computação sobre o assunto?

Eu realmente sinto que, se eu pular e usar as bibliotecas c #, não terei realmente uma base sólida de conhecimento para desenvolver. Acho que preciso aprender esse assunto do zero como um estudante de ciências, depois usar as bibliotecas C #.

Alguém pode sugerir uma abordagem para o aprendizado de threads, talvez alguns links e / ou idéias de projetos?

Desde já, obrigado!

Editar, obrigado por todas as respostas. Algumas pessoas mencionaram que um livro pode ser uma boa ideia, alguém pode sugerir um? Eu preferiria algo agnóstico na linguagem. Alguém sabe em que classe esse material seria coberto em um diploma de Ciência da Computação? Estou tentando pesquisar no Google algumas anotações e tarefas on-line gratuitas.


Não sei se isso ajuda, mas este é um tutorial simples que escrevi no VB.Net há pouco tempo, explicando o conceito básico de encadeamento. Você deve poder convertê-lo para C # com bastante facilidade. chrishaas.wordpress.com/2009/06/25/…
Chris Haas

Estou fortemente tentado a sugerir a criação de uma GUI multithread, com o argumento de que ela ensinaria os limites do que é possível fazer com os threads e permanecerá sã. Mas isso não seria construtivo, por isso vou deixá-lo andar como um comentário, não uma resposta ... :-)
Donal Fellows

Respostas:


3

Escreva um servidor web multiencadeado. Você aprenderá uma tonelada . E não apenas sobre rosqueamento.


4

O problema produtor-consumidor é um exemplo clássico e ajuda você a entender não apenas o encadeamento, mas o agendamento do processador (pode ser demonstrado usando o fork () para processos filho em oposição aos encadeamentos) e como seus programas interagem com o sistema operacional por trás as cenas.

Aqui está um resumo das coisas importantes que você deve entender sobre o encadeamento / bifurcação 1. Como o sistema operacional agenda tarefas (algoritmo round robin, por exemplo) 2. Bloqueio de recursos (se vários encadeamentos estão utilizando o mesmo recurso, você não deseja que eles acessá-los ao mesmo tempo - coisas ruins acontecem)

Aqui está um artigo da wiki sobre esse problema clássico: http://en.wikipedia.org/wiki/Producer-consumer_problem

Basicamente, crie um "Produtor" que gera tópicos de "Consumidores". O produtor produz um "recurso" e os consumidores o consomem. Coloque-o em um loop e observe o que acontece (você ficará surpreso que, eventualmente, os consumidores consumirão mais recursos do que os disponíveis devido a métodos não sincronizados).


Interessante, parece que eu configurei esse padrão sem perceber ao criar um serviço do Windows com thread. Sua descrição foi perfeita. É bom saber que isso quase seria marcado como resposta à minha pergunta em aberto.
Tony

2

Escolha um dos problemas clássicos altamente paralelos. Você pode achar mais interessante escolher um com aceleração super-linear.

Considere pesquisar em uma lista não classificada e não indexada. Esse problema é trivialmente paralelo. Primeiro implemente uma pesquisa encadeada única, depois uma pesquisa paralela ingênua. Implementar roubo de trabalho. Gere alguns conjuntos de dados aleatórios e execute as três versões nos mesmos conjuntos de dados. Calcule a aceleração.


0

Não acho que um livro seja o próximo melhor passo. Um projeto é o caminho a percorrer. Você deve estar animado com isso.

Na primeira vez em que fiz rosqueamento, estava melhorando o desempenho de um rastreador da web. Você pode rastrear muito mais rápido se não estiver fazendo todas as suas E / S de rede em série. Este é um ótimo projeto para começar, porque você pode abordá-lo de várias maneiras, mas não é tão complicado quanto, por exemplo, programação GUI multithread. Também não requer muita habilidade especializada (por exemplo, material computacional pesado).

Então, descubra algumas informações para raspar e começar a invadir. Não demorará muito para você começar algo, será uma introdução suave.


Concordo com um projeto, mas a E / S de rede não é um bom caso de uso para threads. A E / S sem bloqueio é mais eficiente, usa menos recursos e sofre com menos condições de corrida e casos de canto do que o mesmo problema resolvido com threads. Parte do aprendizado de ser um bom programador paralelo é reconhecer quando os threads não são ideais.
Ben Voigt

Você pode muito bem estar certo, a experiência à qual eu estava me referindo foi uma raspagem básica da Web em Python, onde adicionei cerca de 8 linhas de código para torná-lo multithread. Duvido que teria sido tão fácil fazê-lo de forma assíncrona com o código existente, mas gostaria de saber se / como estou errado. Eu acho que parte de aprender a ser um programador bom paralelo pode ser ter muita experiência com o seu cinto, bom e mau :)
Henry

0

Modele um aplicativo Spy vs. Spy simples.

Cada espião é executado em um thread separado.

Cada espião pode causar danos ao outro espião, mas não diretamente.

Cada espião pode roubar recursos valiosos do outro espião, mas não diretamente.

Ambos os espiões têm um conjunto limitado de recursos à sua disposição e devem compartilhá-los. Somente um espião pode usar qualquer recurso de cada vez.


0

De cabeça para baixo : a 4ª edição do livro "Thinking in Java" de Bruce Eckel tem um capítulo muito longo sobre threading (> 100 páginas - quase um livrinho em si). Eu li edições mais antigas do livro e, portanto, não li este capítulo; mas lembro-me de uma das postagens de seu blog (ou das notas de lançamento de seu livro), onde ele afirma que escrever isso foi muito difícil e, no final, foi uma conquista real para ele. Confira...

Além disso, há este curso em vídeo de 2,5 horas neste site de treinamento comercial, mas você pode obter uma avaliação gratuita (deve deixar os dados do cartão de crédito; portanto, não se esqueça de cancelar a inscrição)

http://www.pluralsight-training.net/microsoft/olt/Course/Toc.aspx?n=clr-threading


0

Devo voltar ao básico e talvez examinar alguns textos de ciência da computação sobre o assunto?

Essa é sempre uma boa escolha e eu recomendo que você escolha um bom livro de encadeamento para se familiarizar com o encadeamento. Aprendi multithreading em Java e o conhecimento foi traduzido facilmente em C #.

Se você quiser um exemplo prático, recomendo que tente o problema do filósofo de restaurantes .

Você precisa aprender várias coisas ao entrar no multithreading:

  1. As diferentes maneiras de sincronizar (semáforo, mutex etc.)
  2. Operações atômicas (em C # é feito via Interlocked para operações que não são atômicas por padrão).
  3. Programação simultânea sem bloqueio.
  4. Programação simultânea sem espera.
  5. Threads, ThreadPools, BackgroundWorkers, etc.

Não consigo pensar em outras coisas no momento. O tutorial Albahari parece muito bom!


Infelizmente, filósofos do jantar não é um problema útil. Ele pretende ser uma demonstração das condições de corrida, mas se o impasse realmente ocorre está sujeito aos caprichos do agendador do sistema, outras tarefas, interrupções de hardware ... enfim, é completamente indeterminado, e acho que não é um bom lugar para Comece a aprender.
Ben Voigt

1
@ Ben Voigt, eu concordaria que o problema dos filósofos do jantar não é determinístico, mas eu diria que a maioria dos problemas de segmentação também não é determinística. Quando participei de uma aula de programação simultânea, foi um dos primeiros exercícios que fizemos, agora não estou afirmando que o professor estava necessariamente certo, mas ele certamente foi um dos melhores professores que já tive e sua capacidade de explicar e ensinar a simultaneidade foi excelente. O DPP demonstra apenas um tipo de problema de simultaneidade: impasse. O OP também deve analisar as condições da corrida, o problema da ABA e assim por diante.
Kiril 11/05

@Lirik: Claro, entenda o problema dos filósofos do jantar. Mas eu não o implementaria. Escrever código errado pode se tornar um hábito difícil de quebrar.
Ben Voigt

@ Ben Voigt, desculpe, devo estar faltando alguma coisa: o objetivo do problema dos filósofos gastronômicos é escrever um programa que não trava, então como resolver o DPP exigiria a escrita de "código errado"?
Kiril 11/05
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.