Então, eu vi esse vídeo no Youtube com todos esses mestres em C ++ no GoingNative 2012: painel interativo, onde todos podiam fazer as perguntas.
Este é o vídeo que eu estava falando: GoingNative 2012 - Dia 1 - Painel Interativo: A importância de ser nativo
E, às vezes, 0:24:00 alguém fez uma pergunta muito interessante:
Fazemos programação simultânea há algum tempo usando pthreads, usando threads do Windows e assim por diante. Estou tão feliz que o C ++ e o C alcançaram a programação simultânea, mas parece-me que já está atrasado daqui a cinco anos ou dez anos, porque agora temos todos esses multicores poderosos e a programação desses multicores não deve ser baseada em threads, deve ser baseada em tarefas e a Microsoft [...] possui a biblioteca PPL e assim por diante, e isso é totalmente não refletindo no padrão C ++. [...] A única coisa que tenho medo é que o padrão possa ser bloqueado em threads e meio que dificulte a mudança para a programação baseada em tarefas ...
Agora sou novo nesses conceitos e estou um pouco confuso. O que é realmente programação baseada em tarefas . Este termo se refere à mesma coisa a que se refere à programação sem bloqueio ? Esses dois termos são equivalentes ou existem links entre eles?
fonte
Does this term refer to the same thing that Lock-Free Programming refers to? Are these two equivalent terms or are there any links between them?
alguém pode explicar? Todas essas bibliotecas baseadas em tarefas também são construídas sobre encadeamentos ou há outra maneira de serem implementadas? Obrigado!Respostas:
A Microsoft possui a "Biblioteca Paralela de Tarefas" ou TPL.
É uma abstração de nível superior sobre threads e é baseada em biblioteca; portanto, não vejo razão para que algo semelhante não possa ser construído em C ++, pois o TPL já é baseado em thread e não depende de recursos especiais no padrão de linguagem para sua implementação (embora as palavras-chave
async
eawait
tenham sido adicionadas ao compilador C # para facilitar essa programação).Uma tarefa na estrutura ecológica da Microsoft é mais ou menos equivalente a um futuro ou uma promessa . Basicamente, é uma função sem bloqueio (assíncrona); você o chama, ele retorna o controle de volta enquanto é executado em um novo encadeamento e, em seguida, você recupera o valor de retorno posteriormente, quando estiver disponível.
O TPL possui outros recursos
Parallel.For
, como o que permite processar um loop simultaneamente, usando vários threads. Todas essas coisas podem ser implementadas em C ++ como funções de biblioteca. De fato, essa biblioteca já foi escrita .Tanto quanto eu sei, o PPL (Parallel Patterns Library para Microsoft C ++) não depende de nenhum recurso especial de linguagem.
fonte
Task
e aThread
é que uma tarefa não representa necessariamente uma função sendo executada em outro encadeamento. Representa qualquer coisa que possa terminar ou gerar um valor enquanto não estiver sendo executado no encadeamento atual. Pode ser o resultado de nenhum encadeamento em execução, se não estiver representando o trabalho vinculado à CPU. Provavelmente o exemplo mais comum é o IO assíncrono. Não está representando quando uma função termina em outro thread; representa quando um gancho de SO específico é acionado.Task
permite que você não se importe com a conclusão e o trate como "qualquer operação assíncrona".TaskCompletionSource
. A idéia é que você crie uma tarefa e continue executando, e esse encadeamento eventualmente faz algo que acaba configurando o resultado do TCS, concluindo assim a tarefa sem exigir que mais de um encadeamento seja executado.Há bibliotecas de threads por blocos há séculos no cpp. Existem os Thread Building Blocks da Intel que são muito bons e existem coisas semelhantes, como o OpenMP, que permite abstrair a segmentação de uma maneira do tipo 'deixe o sistema fazer isso por você' (isso é suportado pelo VC ++, você deve definir o / sinalizador openmp nas suas compilações)
A Microsoft também está trabalhando no Casablanca , que pode não ser uma biblioteca de tarefas verdadeiramente genérica, mas é uma estrutura para escrever sistemas baseados em tarefas (principalmente para fins de aplicativos da web) usando algo semelhante ao modelo de ator de Erlang
fonte