Transcrição do áudio
É colega, agora vamos falar sobre threads no Linux. Bom, naturalmente que threads são abstrações. Como assim? Pense você que enquanto você estivesse editando algo no Word, naturalmente esse Word cuidasse somente de capturar as teclas e mostrar na tela. Acontece que, imagine que acabasse a energia, então você perdeu o que você escreveu. Quem foi usuário da linha 9x do Windows sabe do que eu estou falando. Era assim. Não tinha threads como temos lá no Pentium 4, lá no Windows XP que você vai encontrar algo melhorzinho, porque naturalmente provém do NT e provém um bom trabalho de threads. Na verdade não é perfeito. O mundo Linux trabalha com a ideia de threads sendo ali feita a gestão como se fosse um processo. E isso é importante. Você leu no livro do Taneble em Sistemas Operacionais Modernos, no capítulo de processos você viu a questão de que de threads. Threads de processo, threads de núcleo. Viu a diferença entre ambos. A parte boa de um, a parte boa do outro, e a questão híbrida. É quando você pega os dois mundos perfeitos. O mundo do que é perfeito em uma thread de processo e o que é perfeito de uma thread de núcleo. Legal? Então transforma isso tudo em algo ali e show de bola. Legal? Bom, no Linux nós temos essa ideia de threads. Sendo executadas como um processo também, mas elas, você vai ver no texto aqui que vão alinhar entre as threads naturalmente ou como eu posso dizer as variáveis e isso é uma característica de threads de processo. Mas a gestão é feita pelo Schedule como se fosse uma thread de núcleo. Olha que interessante. E no mundo Linux, então, nós temos o mundo perfeito segundo o livro do Turnable com relação a threads. Então vamos dar uma olhada aqui. Bom, vamos aqui. Então temos aqui uma máquina, certo? Essa máquina está com 30 núcleos virtuais. Beleza? 15 núcleos reais no caso. Essa máquina faz dois virtuais para cada um real. E por que o processamento? Porque ele é virtual, o processamento não é real, vocês sabem disso. Bom, e você pode reparar que todas as threads, ou seja, todas as linhas do meu processador estão ali em uso, ou seja, eu tenho 83 coisas acontecendo na minha máquina, boa parte esperando dispositivos de entrada e saída, mas olha o OBS Studio aqui, o quanto de threads ele abriu. E isso é muito interessante. E isso é muito interessante. E isso é muito interessante. E isso é muito interessante. E isso é muito interessante. E isso é muito interessante. E isso é muito interessante. E isso é muito interessante. E isso garante que o OBS Studio trabalhe de uma forma mais suave, 30 coisas acontecendo ao mesmo tempo, tá? Então isso aqui pode variar. Então quando eu faço uma programação com threads de núcleo, e quando eu, naturalmente, tenho um sistema operacional com linhas de processamento suficiente para atender essas threads, tudo fica mais suave e mais distribuído. E isso foi uma grande vantagem. E isso foi uma grande vantagem ali da Apple, alguns anos atrás, com relação a Microsoft, para renderização de vídeo em empresas de marketing, entre outras coisas. Porque o Linux também, embora fosse coerente com a ideia do macOS, que provém lá do Unix, ele é coerente, mas o problema do Linux é que ele não tinha uma boa interface gráfica que chamasse aquela galera de marketing. Mas se você olhar, hoje o Linux... Mas se você olhar, hoje o Linux... Mas se você olhar, hoje o Linux... Mas se você olhar, hoje o Linux... Mas se você olhar, hoje o Linux... Close! Pô, lembrei agora do... Como é que é o nome? Pô, tinha um personagem na escola do professor Raimundo que era engraçado pra caralho. Nossa, eu sou tão atraente! Na verdade, eu sou mais atraente que o Linux, lógico. E aí, o que acontece? Já chama esse grupo, essas pessoas de marketing, né? Já chama esse grupo, essas pessoas de marketing, né? Pra nossa área. Pra nossa área. então threads de kernel usamos threads de kernel deixa eu só mandar uma mensagem aqui bom, mandei frequentemente então nós utilizamos o kernel fazer esse processamento em segundo plano legal no mundo Linux nós utilizamos uma biblioteca chamada libptread nós chamamos ela de pthreads, isso é interessante peraí usar deixa eu mandar um negócio aqui uma mensagem o que acontece eu estou trabalhando galera, trabalhando e gravando vídeo, mas estou trabalhando de domingo, hoje é domingo tá, hoje é domingo e estou trabalhando aqui no meu código e dando aula ao mesmo tempo infelizmente bom, vamos lá então nós temos aqui a pthread então nós temos uma implementação de pthreads essa implementação ela está na libptread então é comum a gente chamar biblioteca pthread mas na verdade o arquivo começa com lib sempre assim e nós podemos invocar isso e ela é padrão posix na verdade tudo que é padrão posix você vai encontrar essa pthread aqui eu tenho explicação do código aberto eu vou explicar então eu mesmo aqui para você no código então nós temos aqui a biblioteca e o string então quando for feita a compilação disso aqui essa compilação vai fazer a linkagem com essa biblioteca e a linkagem com essa biblioteca repare que eu não estou trazendo o ponto h para isso aqui, então quer dizer que ele vai fazer um um compilado menor né e agora pera aí não não não não não não pera, pera, pera pesquisa pesquisa sim não faz isso não desculpa legal vamos lá aqui eu tenho então pthreads aqui eu tenho um namespace estándard eu não deveria ter colocado porque eu coloquei aqui depois e esqueci de vir tirar da aqui então você tem duas formas de fazer treads a forma mais bonita É quando você cria uma classe que herda de thread, porque você pode manipular o objeto com mais propriedade. O objeto referente a thread. Para melhorar a aula, o cachorro está no estúdio e começou a roncar. Puta que pariu. Hoje, domingo, o negócio é sinistro. Então, aqui eu tenho uma função, que é a segunda forma de você rodar threads. Você cria uma função e cria um objeto thread a assumir essa função. Um objeto thread do sistema, não o seu. Esse aqui é o mais usado pela galera de infraestrutura. Eu utilizo assim quando eu vou fazer algo que vai ficar na infraestrutura. Por quê? O pessoal de infraestrutura não é como eu. Eu sou formado em programação, então eu não posso fazer algo. Eles não vão entender. E depois tudo sobra dentro do meu rabo. Entendeu? Então, eu tenho que fazer algo que eles vão conseguir dar manutenção. Para que eles consigam também fazer alguma coisa. Então, assim eu programo quando o meu alvo, no caso, o meu cliente, é a infraestrutura. Legal? Estou muito acostumado a falar alvo, não sei porquê. Então, aqui eu tenho uma função. A função, na verdade, retorna um ponteiro de execução. Void é retorno de ponteiro de execução. Essa é a verdade. O nome da função é task1. E eu vou receber aqui, então, um argumento que é uma string idiota. Para escrever uma string idiota na tela. Legal? Então, aqui eu tenho um int main. E aí eu tenho aqui o tipo pthread. Desculpa, o tipo thread. Que está dentro da biblioteca pthreads. Estou criando um objeto com o nome t1, t2, t3. Buffer. Minha variável bonitinha. Minha variável que eu quis criar. Meu nome que eu queria criar da minha variável. FolderCelandia. Não importa. É o nome da sua variável. Certo? E está, naturalmente, passando como primeiro argumento o nome da função. Que vai ser executado em segundo plano. E um texto. Legal? Que vai entrar aqui como argumento. Então, simplesmente, eu executo o join. E, geralmente, nas bibliotecas eu tenho duas formas de executar, tá? A primeira é start. Então, como funciona? O processo pai, vamos colocar assim, vou chamar de processo pai, inicia. Não poderia chamar de processo pai, desculpa. A thread principal inicia a thread secundária. Essa é a verdade. Aí, se a thread principal morrer, acabar, chegar no final, acabar, chegar no fim da execução, a thread secundária continua a executar até o fim de sua execução. E aí, então, o programa termina. Legal? É assim que acontece. O join, não. O join, o que que acontece? Eles vão esperar. É como se fosse uma barreira. Isso aqui, você tem que, para entender a barreira, a teoria de barreiras, você tem que pegar o livro do Tannibal, mas no capítulo, lá de sistemas operacionais modernos, no capítulo de multiprocessamento, no capítulo de multiprocessamento, vai ter um tópico chamado barreiras. Então, isso aqui é uma barreira. Tá? É uma barreira. Quer dizer que as duas threads, no caso, a thread principal do sistema, que inicializou a thread secundária, uma vai esperar a outra ali, elas vão sair juntas. Porque o programa precisa de algum tipo de finalização. Isso é chamado de barreiras, cara. Tá? Deixei o GitHub, não deixei no GitHub. É muito simples. Na hora de processar, você tem que informar que você precisa da Pthread. E, no mínimo, a standard lib 11. Mas, lógico, você vai ver o que você tem aí. Se você tem a 17, ela é mais atual. Tá boa? Então, você tem que, naturalmente, cadê o link de referência que eu coloquei? Eu não coloquei o link de referência? Procura aí no seu sistema, né? Qual é a versão do C++ que você tem aí. Legal? E aí, no mínimo, você precisaria de uma 11. E, então, você chamaria de Pthread CPP, chamaria de Pthread, desculpe, Pthread, depois de você executar, você vai ver que ela funciona. Cara, se você fizer tudo direitinho, o OBS, ele é um programa muito bem feito, né? Dá pra ver que ele usa muito bem a minha máquina como um todo. Ele cria inúmeras threads. Mas, tudo executado. Parabéns, quem desenvolveu o OBS Studio. É isso aí. Cara, é assim mesmo. Fica mais suave e usa melhor a minha máquina. Parabéns. Legal? Até o nosso próximo vídeo, onde nós vamos falar sobre processo pai, processo filho, fork. Até mais. Tchau. E aí