O que é um conjunto de encadeamentos?

51

Como um implementar um conjunto de threads? Eu tenho lido na wikipedia para "threadpool", mas eu ainda não consigo descobrir o que se deve fazer para resolver esta questão (possivelmente porque eu não entendi muito bem o que é um conjunto de threads em termos simples).

Alguém pode me explicar em inglês simples o que é um conjunto de threads e como alguém responderia a essa pergunta?

    
por John Smith 04.11.2012 / 17:14
fonte

4 respostas

87

Um conjunto de encadeamentos é um grupo de encadeamentos inativos pré-instanciados que estão prontos para receberem trabalho. Eles são preferidos ao instanciar novos threads para cada tarefa quando há um grande número de tarefas curtas a serem executadas, em vez de um pequeno número de tarefas longas. Isso evita ter que incorrer na sobrecarga de criar um thread um grande número de vezes.

A implementação varia de acordo com o ambiente, mas, em termos simplificados, você precisa do seguinte:

  • Uma maneira de criar segmentos e mantê-los em um estado ocioso. Isso pode ser conseguido fazendo com que cada thread espere em uma barreira até que o pool o entregue. (Isso também pode ser feito com mutexes).
  • Um contêiner para armazenar os encadeamentos criados, como uma fila ou qualquer outra estrutura que tenha uma maneira de adicionar um encadeamento ao conjunto e extraí-lo.
  • Uma interface padrão ou classe abstrata para os segmentos a serem usados no trabalho. Essa pode ser uma classe abstrata chamada Task com um método execute() que faz o trabalho e retorna.

Quando o conjunto de encadeamentos for criado, ele irá instanciar um determinado número de encadeamentos para disponibilizar ou criar novos conforme necessário, dependendo das necessidades da implementação.

Quando o pool recebe um Task , ele pega um segmento do contêiner (ou aguarda que um fique disponível se o contêiner estiver vazio), entrega um Task e atende à barreira. Isso faz com que o encadeamento ocioso continue a execução, chamando o método execute() do Task que foi fornecido. Quando a execução estiver concluída, o thread retorna ao pool para ser colocado no contêiner para reutilização e, em seguida, encontra sua barreira, colocando-se em repouso até que o ciclo se repita.

    
por 04.11.2012 / 17:55
fonte
8

O conjunto de encadeamentos é uma coleção de encadeamentos gerenciados geralmente organizados em uma fila, que executa as tarefas na fila de tarefas.

Criar um novo objeto de thread toda vez que você precisar de algo para ser executado de forma assíncrona é caro. Em um pool de threads, você adicionaria as tarefas que deseja executar de forma assíncrona à fila de tarefas e o pool de threads se encarregará de atribuir um thread disponível, se houver, para a tarefa correspondente. Assim que a tarefa é concluída, o segmento agora disponível solicita outra tarefa (supondo que haja algum à esquerda).

O conjunto de encadeamentos ajuda a evitar a criação ou a destruição de mais encadeamentos, do que seria realmente necessário.

Eu começaria criando uma classe com uma fila de threads e uma fila de tarefas. Em seguida, implemente um método que adicione uma tarefa à fila de tarefas e continue a partir daí. Obviamente, você também deve permitir definir o máximo permitido de encadeamentos em um conjunto de encadeamentos.

    
por 04.11.2012 / 17:53
fonte
1

Exemplo de vida real;

  1. Facilidade: sistema operacional
  2. Seções: Aplicativos
  3. Pessoas: tópicos

Você tem uma instalação onde 12 pessoas estão trabalhando. Existem 3 secções desta facilidade. Cozinha, banheiros e segurança. Se você não usa técnica de pool de threads, é assim que funciona: Todas as 12 pessoas estarão em uma sala de reunião, se novos clientes vierem por instalações e pedirem tarefas, então você separará as pessoas em grupos e as enviará para fazer seu trabalho. e volte para a sala de reunião. Mas, antes de assumirem seus deveres, há uma fase de preparação. Eles precisam usar uniformes corretos, equipar certos dispositivos e caminhar até a seção, terminar o trabalho e voltar. Assim, uma vez que todas as vezes que terminam o trabalho (finalização dos fios), eles precisam caminhar de volta para a sala de reunião, despir o uniforme, tirar o equipamento e esperar o próximo trabalho. Estes referem-se à criação de contexto de thread, é a alocação de memória e informações de rastreamento por sistema operacional. É muito demorado para o SO reorganizar novas necessidades de threads.

Se você estiver usando o pool de threads, então, no início da manhã, você atribuirá 6 pessoas à cozinha, 2 pessoas ao banheiro e 4 pessoas à segurança. Então, eles só farão a preparação uma vez por dia. Mesmo que não haja clientes na cozinha, essas 4 pessoas estarão lá, em marcha lenta, para quaisquer tarefas futuras. Eles não precisam voltar para a sala de reunião até que a cozinha seja fechada (o aplicativo termina). Essas 4 pessoas estão no pool de aplicativos da Cozinha e prontas para atendê-lo rapidamente. Mas você não pode prometer que eles estão trabalhando o dia todo, já que a cozinha pode se tornar ociosa no tempo. Mesma lógica se aplica para banheiros e segurança também.

No primeiro cenário, você não perde nenhum thread para nenhuma tarefa, MAS levará um bom tempo para preparar cada thread para cada tarefa. No segundo, você prepara os tópicos com antecedência, então você não pode garantir que você estará usando todos os threads para todas as tarefas, mas o SO faz uma grande otimização nele, então você pode seguramente confiar nele.

    
por 24.02.2017 / 22:28
fonte
0

No aplicativo multithread, o pool de threads é um "pool de threads disponíveis" que pode ser usado pelo seu aplicativo. Normalmente, por ex. .NET, tudo é gerenciado, então você apenas atribui tarefas e, uma vez que um thread esteja livre, ele irá executá-lo. Então, para implementar um conjunto de encadeamentos, eu esperaria criar um conceito em que as tarefas fossem tomadas automaticamente por encadeamentos livres sem criação explícita de encadeamentos para cada tarefa.

    
por 04.11.2012 / 17:29
fonte