Transcrição do áudio
E 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 você imaginava que acabasse energia e então você perdeu o que você escreveu. Quem foi o 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 que você pode ter e provém um bom trabalho de threads. Na verdade não é perfeito. O mundo Linux ele trabalha com a ideia de threads sendo feita gestão como se fosse um processo e isso é importante. Você leu no livro do Turnable, 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, então para uma thread de processo e o que é perfeito de uma thread de núcleo. Então transforma isso tudo em algo ali e show de bola. Bom no Linux nós temos essa ideia de threads sendo executadas como um processo também. Mas você vai ver no texto aqui que vão alinhar entre as threads naturalmente, como eu posso ver 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 ideia 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 ela faz dois virtuais para cada um real. E por que o processamento 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. Isso garante que o OBS se trabalhe de uma forma mais suave. 30 coisas acontecendo ao mesmo tempo. 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 suave e mais distribuído. Isso foi uma grande vantagem ali da Apple alguns anos atrás com relação à 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 provenha 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 um Linux moderno, ele é atraente, nem tanto, eu sou muito mais atraente com Linux, com certeza. Closing. Por lembrei agora do que é o nome. Pô, tinha um personagem na escola do professor Raimundo que era engraçado. Bom, sou eu estou atraente, na verdade eu sou mais atraente com Linux. E aí o que acontece? Já chama esse grupo, essas pessoas de marketing, né? Está na nossa área aqui. Então threads de kernel, usamos threads de kernel. Peraí, 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 Liby Petragem. Nós chamamos ela de Petragem, isso é interessante, cara. Peraí. Vamos 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. Está hoje é domingo, tá? Hoje é domingo. E estou trabalhando aqui em meu código e dando aula ao mesmo tempo, infelizmente. Bom, vamos lá. Então nós temos aqui a Petragem, então temos uma implementação de Petragem. Essa implementação está na Liby Petragem. Então é comum a gente chamar biblioteca Petragem, mas na verdade o arquivo começa com Liby. Sempre assim, sempre assim. E nós podemos invocar isso. E ela é padrão POSIX. Na verdade tudo que é padrão POSIX, você vai encontrar essa Petragem. Aqui eu tenho a explicação do código abaixo, eu vou explicar então, eu mesma aqui para você no código. Então nós temos aqui a biblioteca Yo-String, então quando feita a compilação disso aqui, essa compilação vai fazer a linkagem com essa biblioteca e para que eu não estou trazendo o .h para isso aqui, então quer dizer que ele vai fazer um compilado menor, né? E agora, pera aí. Não, não, não, não, pera aí. Sim, não, faz isso não. Desculpa. Legal, vamos lá. Aqui eu tenho então Petragem, aqui eu tenho o namespace standard. Eu não deveria ter colocado porque eu coloquei aqui depois e esqueci de tirar daqui. Então você tem duas formas de fazer threads. A forma mais bonita é quando você cria uma classe hierda de thread, porque você pode manipular o objeto com mais propriedade, o objeto referente à thread. Para melhorar a aula o cachorro da um estúdio começou a arrumcar. O tagpário. Hoje, domingo, agora você se trimestra, hein? 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. Essa aqui é o mais usado pela galera de infraestrutura. Eu utilizo assim quando eu vou fazer algo que vai ficar na infraestrutura, porque o pessoal de infraestrutura não é como eu, que sou formado lá em programação e... Então eu não posso fazer algo que eles não vão entender e depois tudo sobra dentro do meu rabo, entendeu? Então eu tenho que fazer o 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 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 o ponteiro de execução, void retorno de ponteiro de execução, essa é a verdade. O nome da função é task1, tá? E eu vou receber aqui 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 thread, tá? Desculpe, 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, foda-silândia, não importa. É o nome da sua variável, certo? E está, naturalmente, passando como o 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. Geralmente, nas bibliotecas, eu tenho duas formas de executar, tá? A primeira é start. Então, como funciona? O processo, o pai, vamos colocar assim, vou chamar de processo pai, né? Inicia, não pode chamar de processo pai, desculpa. A thread principal, inicia thread secundária, essa é a verdade. Aí, se a thread principal morrer, acabar chegando no fim da execução, a thread secundária continua 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 acontece? Eles vão esperar, é como se fosse uma barreira. Isso aqui, se 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 da thread principal do sistema, que inicializou a thread secundária, uma vai esperar, a outra aliança vão sair juntas. O que o programa precisa de algum tipo de finalização. Isso é chamado de barreiras, cara. Deixei o GitHub, não deixei no GitHub, é muito simples. Na hora de processar, você tem que informar que você precisa da thread. E no mínimo, a estándar de 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? Procure aí no seu sistema. 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 thread CPP, você precisa de thread. Depois, você vai 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 executa 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, aonde nós vamos falar sobre processo pai, processo filho, fork. Até mais, tchau!