{"id":3909,"date":"2024-10-06T05:30:20","date_gmt":"2024-10-06T05:30:20","guid":{"rendered":"https:\/\/www.goncalo.pt\/por\/?p=3909"},"modified":"2025-02-10T05:00:39","modified_gmt":"2025-02-10T05:00:39","slug":"2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp","status":"publish","type":"post","link":"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/","title":{"rendered":"2024-10-05 &#8211; Sistema de Gest\u00e3o de Threads finalizado no meu Game Engine em C++&#8230;"},"content":{"rendered":"\n<p>J\u00e1 finalizei o sistema de gest\u00e3o autom\u00e1tico de threads no meu Game Engine.<\/p>\n\n\n\n<p>E porqu\u00ea usar threads em primeiro lugar? Simples. Se temos um computador com por exemplo uns 8 cores e 8 threads, de que nos serve correr a aplica\u00e7\u00e3o em apenas uma thread, onde ter\u00edamos no m\u00e1ximo 12,5% (16,6% se usasse 6 threads das 8) de potencial uso do CPU, o que significa que nunca usar\u00edamos os 100% que o CPU nos proporciona, e ficar\u00edamos com tudo mais lento.<\/p>\n\n\n\n<p>Para isso, temos obviamente de usar Multi-Threading, dividir a carga dos nossos programas em threads que correm em threads\/cores distintos para usarmos n\u00e3o 12,5% do CPU mas sim uns 30%, 50%, 70%, e com isso ter muito mais FPS e um jogo muito mais r\u00e1pido.<\/p>\n\n\n\n<p>No come\u00e7o eu usava Multi-Threading ocasionalmente porque estive mais preocupado com o que ia fazendo no Game Engine, como sistemas de \u00e1gua, chuva, neve, bal\u00edstica, armas, etc.<\/p>\n\n\n\n<p>Mas chegamos a uma altura em que temos de come\u00e7ar a pensar num sistema de gest\u00e3o din\u00e2mica de threads, para onde possamos enviar tarefas para que o tal sistema decida que threads usar, divide o trabalho entre elas, entre outras coisas, para que tudo funcione na perfei\u00e7\u00e3o.<\/p>\n\n\n\n<p>Abaixo podemos ver as threads obreiras, \u00e0s quais chamei de &#8220;TaskRunner&#8221;, porque correm as tarefas que para elas envio:<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video controls src=\"https:\/\/www.goncalo.pt\/por\/wp-content\/uploads\/2024\/10\/2024-10-05-Multi-Threading-Manager-finished-on-my-Cpp-Game-Engine.mp4\"><\/video><figcaption class=\"wp-element-caption\">2024-10-05 &#8211; Sistema de Gest\u00e3o de Threads finalizado no meu Game Engine em C++&#8230;<\/figcaption><\/figure>\n\n\n\n<p>No exemplo acima podem ver \u00e0 direita, as v\u00e1rias threads de nome &#8220;TaskRunner&#8221; que tenho activas, a aceitar dividir entre elas carga, mas neste caso usei-as apenas para as gotas de chuva, para que desse uma percentagem de carga relativamente igual entre elas, e coloquei um n\u00famero em cada uma delas para ficar com um aspecto mais giro, como &#8220;TaskRunner[01]&#8221;, &#8220;TaskRunner[02]&#8221;, etc.<\/p>\n\n\n\n<p>Acima uso o comando top no Linux para visualizar as mesmas, no meio \u00e0 direita, e o htop acima \u00e0 direita, mas o top neste caso \u00e9 melhor para o efeito.<\/p>\n\n\n\n<p>No v\u00eddeo anterior, eu tinha de prop\u00f3sito criado as threads em tempo real em cada loop do Game Engine, ou seja, em casa FPS (Frame Por Segundo), e por isso podiam ver que o n\u00famero das threads mudava o tempo todo, o que era mau, mas que fiz apenas para motivos did\u00e1cticos, como exemplo:<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video controls src=\"https:\/\/www.goncalo.pt\/por\/wp-content\/uploads\/2024\/10\/2024-10-03-Testing-Multi-Threading-on-my-Cpp-Game-Engine-Rain.mp4\"><\/video><figcaption class=\"wp-element-caption\">2024-10-03 &#8211; Testando Multi-Threading com a Chuva do meu Game Engine em C++&#8230;<\/figcaption><\/figure>\n\n\n\n<p>Claro que isto \u00e9 errado, pois imaginem que eu tenho uns 300 FPS no jogo, e que em cada um desses 300 FPS (300 loops), eu abriria umas 20 threads para dividir carga, isto significaria que eu estaria a sobrecarregar o Kernel umas 300*20=6000 vezes por segundo! Isto \u00e9 errado, tornaria tudo mais lento, e sobrecarregaria o sistema.<\/p>\n\n\n\n<p>Obviamente que no exemplo anterior apenas o fiz para poderem ver uma thread a ser gerada dinamicamente sempre que activava o sistema de chuva, e podem ver que o PID dessa \u00fanica thread que tratava da chuva estaria sempre a mudar, e mudaria umas 300 vezes por segundo se fossem 300 FPS, s\u00f3 a v\u00eaem mudar pouco devido ao tempo de actualiza\u00e7\u00e3o do htop no exemplo.<\/p>\n\n\n\n<p>Hoje \u00e9 diferente, como mostrei acima, voc\u00eas j\u00e1 v\u00eaem que o PID sempre igual nessas threads, e as mesmas j\u00e1 identificadas para f\u00e1cil consulta e debugging:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"228\" src=\"https:\/\/www.goncalo.pt\/por\/wp-content\/uploads\/2024\/10\/2024-10-06-Multi-Threading-Manager-finished-on-my-Cpp-Game-Engine-Thread-TaskRunners-View.gif\" alt=\"2024-10-05 - Vista das TaskRunners no meu Sistema de Gest\u00e3o de Threads finalizado no meu Game Engine em C++...\" class=\"wp-image-3912\" style=\"width:1138px;height:auto\"\/><figcaption class=\"wp-element-caption\">2024-10-05 &#8211; Vista das TaskRunners no meu Sistema de Gest\u00e3o de Threads finalizado no meu Game Engine em C++&#8230;<\/figcaption><\/figure>\n\n\n\n<p>Assim, n\u00e3o estamos a criar centenas ou milhares de threads em cada segundo, o que seria simplesmente parvo.<\/p>\n\n\n\n<p>Este \u00e9 o exemplo anterior, feito mal de prop\u00f3sito, onde era invocada s\u00f3 uma thread para tomar conta de tudo, criada em tempo real em cada loop (da\u00ed o seu PID mudar sempre), ao inv\u00e9s de termos v\u00e1rias a trabalhar num bocadinho da tarefa para tornar tudo mais r\u00e1pido (terminam mais r\u00e1pido do que se fosse s\u00f3 uma), e ao mesmo tempo s\u00f3 s\u00e3o criadas no arranque do Game Engine e n\u00e3o em cada loop:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"278\" src=\"https:\/\/www.goncalo.pt\/por\/wp-content\/uploads\/2024\/10\/2024-10-03-Testing-Multi-Threading-on-my-Cpp-Game-Engine-Rain-Only-Threads-Created-Real-Time.gif\" alt=\"2024-10-03 - Testando Multi-Threading com a Chuva do meu Game Engine em C++ - Vendo as Threads a ser criadas em cada loop em Real-Time\u2026\" class=\"wp-image-3921\" style=\"width:1136px;height:auto\"\/><figcaption class=\"wp-element-caption\">2024-10-03 &#8211; Testando Multi-Threading com a Chuva do meu Game Engine em C++ &#8211; Vendo as Threads a ser criadas em cada loop em Real-Time\u2026<\/figcaption><\/figure>\n\n\n\n<p>Nas linguagens mais f\u00e1ceis como Java e C# e outras, ningu\u00e9m tem de se preocupar com este tipo de coisas.<\/p>\n\n\n\n<p>Mas em C ou C++ isto tem de ser pensado ao pormenor. Podemos ter poder e performance, mas temos sempre um pre\u00e7o a pagar, com a complexidade da coisa.<\/p>\n\n\n\n<p>Podem ver tamb\u00e9m que os milhares de gotas de chuva, ocupam uns at\u00e9 60% de uma thread, e no meu caso, como uso computadores fracos (port\u00e1teis de uns 500 a 700 euros) mesmo para me for\u00e7ar a optimizar c\u00f3digo, em que s\u00f3 tenho 8 threads dispon\u00edveis, s\u00f3 criei 6 threads para estes trabalhos (calculo as mesmas no arranque consoante o potencial de cada hardware da m\u00e1quina que executa o meu Game Engine), e decidi dividir a carga sempre entre todas.<\/p>\n\n\n\n<p>Assim, eu poderia ter s\u00f3 uma a trabalhar a 60% da sua capacidade (que numa m\u00e1quina com 8 cores seria 60% de 12.5% (pois 100%\/8 threads=12.5), ou seja 7,5%.<\/p>\n\n\n\n<p>Mas o meu sistema decide em tempo real dividir neste caso a carga pelas 6 threads dado que est\u00e3o dispon\u00edveis e s\u00f3 estou a usar as mesmas para o sistema de chuva, e da\u00ed podem ver que cada uma se esfor\u00e7a menos, cada uma indo apenas a 12% do seu potencial, o que \u00e9 muito bom.<\/p>\n\n\n\n<p>\u00c9 preciso dizer que ocupava mem\u00f3ria de 2.2 GB no exemplo acima (este \u00e9 um update de 2025-02-10), porque eu usava containers STL para desenvolver o Game Engine sem preocupa\u00e7\u00f5es, mas de tempos a tempos foco-me em optimizar o meu Game Engine, e ap\u00f3s essas optimiza\u00e7\u00f5es, ele ocupava entre 20 MB e 200 MB de mem\u00f3ria (100 a 10 vezes menos), e com execut\u00e1veis abaixo de 1 MB, e isto acontece porque por vezes desenvolvo rapidamente (sem me preocupar com optimiza\u00e7\u00f5es), e depois de tempos a tempos reescrevo os containers \u00e0 pata para consumir muito menos mem\u00f3ria. Poder\u00e3o ver mais sobre isso no post abaixo, e l\u00e1 h\u00e1 links para outros associados antes e depois:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-gon-alo-ferreira wp-block-embed-gon-alo-ferreira\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"YcHeVb8tem\"><a href=\"https:\/\/www.goncalo.pt\/por\/2025\/02\/09\/2025-02-09-o-meu-game-engine-em-c-a-ocupar-apenas-27-mb-de-memoria-e-com-binarios-de-300k\/\">2025-02-09 &#8211; O meu Game Engine em C++ a ocupar apenas 27 MB de mem\u00f3ria e com bin\u00e1rios de 300K&#8230;<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&#8220;2025-02-09 &#8211; O meu Game Engine em C++ a ocupar apenas 27 MB de mem\u00f3ria e com bin\u00e1rios de 300K&#8230;&#8221; &#8212; Gon\u00e7alo Ferreira\" src=\"https:\/\/www.goncalo.pt\/por\/2025\/02\/09\/2025-02-09-o-meu-game-engine-em-c-a-ocupar-apenas-27-mb-de-memoria-e-com-binarios-de-300k\/embed\/#?secret=OJsQ9LxHwG#?secret=YcHeVb8tem\" data-secret=\"YcHeVb8tem\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><figcaption class=\"wp-element-caption\">2025-02-09 \u2013 O meu Game Engine em C++ a ocupar apenas 27 MB de mem\u00f3ria e com bin\u00e1rios de 300K\u2026<\/figcaption><\/figure>\n\n\n\n<p>Continuando o post original&#8230;<\/p>\n\n\n\n<p>Mais tarde incluirei aqui muitas outras tarefas, como talvez certas explos\u00f5es ou anima\u00e7\u00f5es mais complexas, c\u00e1lculos de bal\u00edstica, desenho de n\u00edveis, etc, e a\u00ed o meu sistema ir\u00e1 dividir a carga em tempo real consoante o que ele v\u00ea que essas tarefas requerem do processador.<\/p>\n\n\n\n<p>No come\u00e7o s\u00e3o estudadas, e depois tudo funciona na perfei\u00e7\u00e3o.<\/p>\n\n\n\n<p>Este sistema tem uma vantagem, \u00e9 que nunca mais me preocupo com threads, sempre que quero abrir algo numa nova thread, simplesmente mando a tarefa para o meu gestor, e ele trata de tudo sozinho.<\/p>\n\n\n\n<p>De qualquer das formas este post \u00e9 n\u00e3o s\u00f3 parte do meu di\u00e1rio de desenvolvimento, como tamb\u00e9m algo que pode ser usado para fins acad\u00e9micos.<\/p>\n\n\n\n<p>E claro, aproveitei para mostrar a beleza dos paineis publicit\u00e1rios que criei no meu dia de anos:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"337\" src=\"https:\/\/www.goncalo.pt\/por\/wp-content\/uploads\/2024\/09\/2024-09-05-Outdoor-Advertising-Quicky-Style-on-my-Cpp-Game-Engine.gif\" alt=\"2024-09-04 - Paineis Publicit\u00e1rios estilo Tricky Quicky no meu Game Engine em C++...\" class=\"wp-image-3846\" style=\"width:1140px;height:auto\"\/><figcaption class=\"wp-element-caption\">2024-09-04 &#8211; Paineis Publicit\u00e1rios estilo Tricky Quicky no meu Game Engine em C++&#8230;<\/figcaption><\/figure>\n\n\n\n<p>E que se baseiam no jogo Tricky Quiky dos anos 90:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"351\" height=\"197\" src=\"https:\/\/www.goncalo.pt\/por\/wp-content\/uploads\/2024\/09\/2024-09-05-Example-of-Outdoor-Advertising-on-Tricky-Quicky-Game-1994.gif\" alt=\"2024-09-04 - Exemplo da Publicidade usada no Jogo Tricky Quiky dos Anos 90...\" class=\"wp-image-3849\" style=\"width:1140px;height:auto\"\/><figcaption class=\"wp-element-caption\">2024-09-04 &#8211; Exemplo da Publicidade usada no Jogo Tricky Quiky dos Anos 90&#8230;<\/figcaption><\/figure>\n\n\n\n<p>Bem, agora como tenho tido pouco tempo farei pausa de alguns dias de novo, e mais tarde melhorarei o n\u00edvel de testes de chuva para que funcione com este novo sistema, antes de saltar para novas aventuras no desenvolvimento do meu Game Engine.<\/p>\n\n\n\n<p>At\u00e9 \u00e0 pr\u00f3xima, hasta!<\/p>\n\n\n\n<p>2024-10-05\/06.<\/p>\n\n\n\n<p>Publicado no mesmo dia no meu LinkedIn em 2024-10-09, com o texto:<\/p>\n\n\n\n<p>\u00abO que mostrei da outra vez foi s\u00f3 para fins did\u00e1dicos, com threads geradas em real-time \u00e0s centenas por segundo (nada de pr\u00e1tico).<br><br>Aqui j\u00e1 t\u00eam as minhas threads que correm tasks bem definidas a fazer o seu trabalho.\u00bb<\/p>\n\n\n\n<p>Em:<\/p>\n\n\n\n<p><a href=\"https:\/\/www.linkedin.com\/posts\/goncalopt_o-que-mostrei-da-outra-vez-foi-s%C3%B3-para-fins-activity-7249719904172445697-D_r4?utm_source=share&amp;utm_medium=member_desktop\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.linkedin.com\/posts\/goncalopt_o-que-mostrei-da-outra-vez-foi-s%C3%B3-para-fins-activity-7249719904172445697-D_r4?utm_source=share&amp;utm_medium=member_desktop<\/a><\/p>\n\n\n\n<p>Pr\u00f3ximo post associado ao meu Game Engine (tamb\u00e9m associadl a Multi-Threading, Chuva e Neve, e o n\u00edvel de testes):<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-gon-alo-ferreira wp-block-embed-gon-alo-ferreira\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"6l0nrptk8b\"><a href=\"https:\/\/www.goncalo.pt\/por\/2024\/10\/16\/2024-10-16-finalizados-os-algoritmos-de-neve-e-chuva-no-meu-game-engine-em-c\/\">2024-10-16 &#8211; Finalizados os Algoritmos de Neve e Chuva no meu Game Engine em C++&#8230;<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&#8220;2024-10-16 &#8211; Finalizados os Algoritmos de Neve e Chuva no meu Game Engine em C++&#8230;&#8221; &#8212; Gon\u00e7alo Ferreira\" src=\"https:\/\/www.goncalo.pt\/por\/2024\/10\/16\/2024-10-16-finalizados-os-algoritmos-de-neve-e-chuva-no-meu-game-engine-em-c\/embed\/#?secret=h8D4vxUMFr#?secret=6l0nrptk8b\" data-secret=\"6l0nrptk8b\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><figcaption class=\"wp-element-caption\">https:\/\/www.goncalo.pt\/por\/2024\/10\/16\/2024-10-16-finalizados-os-algoritmos-de-neve-e-chuva-no-meu-game-engine-em-c\/<\/figcaption><\/figure>\n\n\n\n<p>Post anterior associado ao meu Game Engine (e tamb\u00e9m ao sistema de Multi-Threading):<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-gon-alo-ferreira wp-block-embed-gon-alo-ferreira\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"Dk8wIoO5Nq\"><a href=\"https:\/\/www.goncalo.pt\/por\/2024\/10\/03\/2024-10-03-testando-multi-threading-com-a-chuva-do-meu-game-engine-em-c\/\">2024-10-03 &#8211; Testando Multi-Threading com a Chuva do meu Game Engine em C++\u2026<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&#8220;2024-10-03 &#8211; Testando Multi-Threading com a Chuva do meu Game Engine em C++\u2026&#8221; &#8212; Gon\u00e7alo Ferreira\" src=\"https:\/\/www.goncalo.pt\/por\/2024\/10\/03\/2024-10-03-testando-multi-threading-com-a-chuva-do-meu-game-engine-em-c\/embed\/#?secret=t7pg3LlPir#?secret=Dk8wIoO5Nq\" data-secret=\"Dk8wIoO5Nq\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><figcaption class=\"wp-element-caption\">2024-10-03 \u2013 Testando Multi-Threading com a Chuva do meu Game Engine em C++\u2026<\/figcaption><\/figure>\n\n\n\n<p>O Post associado aos placards publicit\u00e1rios que mencionei aqui:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-gon-alo-ferreira wp-block-embed-gon-alo-ferreira\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"59xIDMNWAS\"><a href=\"https:\/\/www.goncalo.pt\/por\/2024\/09\/05\/2024-09-04-paineis-publicitarios-estilo-tricky-quicky-no-meu-game-engine-em-c\/\">2024-09-04 &#8211; Paineis Publicit\u00e1rios estilo Tricky Quicky no meu Game Engine em C++\u2026<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&#8220;2024-09-04 &#8211; Paineis Publicit\u00e1rios estilo Tricky Quicky no meu Game Engine em C++\u2026&#8221; &#8212; Gon\u00e7alo Ferreira\" src=\"https:\/\/www.goncalo.pt\/por\/2024\/09\/05\/2024-09-04-paineis-publicitarios-estilo-tricky-quicky-no-meu-game-engine-em-c\/embed\/#?secret=PzpL6pVif2#?secret=59xIDMNWAS\" data-secret=\"59xIDMNWAS\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><figcaption class=\"wp-element-caption\">2024-09-04 \u2013 Paineis Publicit\u00e1rios estilo Tricky Quicky no meu Game Engine em C++\u2026<\/figcaption><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"494\" height=\"278\" src=\"https:\/\/www.goncalo.pt\/por\/wp-content\/uploads\/2024\/10\/2024-10-06-Multi-Threading-Manager-finished-on-my-Cpp-Game-Engine.gif\" alt=\"2024-10-05 - Sistema de Gest\u00e3o de Threads finalizado no meu Game Engine em C++...\" class=\"wp-image-3911\" style=\"width:1137px;height:auto\"\/><figcaption class=\"wp-element-caption\">2024-10-05 &#8211; Sistema de Gest\u00e3o de Threads finalizado no meu Game Engine em C++&#8230;<\/figcaption><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>J\u00e1 finalizei o sistema de gest\u00e3o autom\u00e1tico de threads no meu Game Engine. E porqu\u00ea usar threads em primeiro lugar?<\/p>\n","protected":false},"author":1,"featured_media":3911,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,350,284,5,3,134,4,164,346,266,162,133],"tags":[7,186,118,207,24,23,117,389,282,120,383,187,189,166,172,241,160,345,344,158,384,26,25],"class_list":["post-3909","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-game-development","category-design-6-game-engine","category-platformers","category-programacao","category-projectos","category-retro-gaming","category-softwares","category-top","category-top-10-game-engine","category-top-20","category-top-game-engine","category-video-jogos","tag-c","tag-chuva","tag-desenvolvimento-de-jogos","tag-dev","tag-game-dev","tag-game-engine","tag-motor-de-jogos","tag-multi-threading","tag-plaltformer","tag-programacao","tag-publicidade","tag-rain","tag-relampagos","tag-simulacao","tag-simulacoes","tag-sonic","tag-top","tag-top-10-game-engine","tag-top-20","tag-top-game-engine","tag-tricky-quicky","tag-videogames","tag-videojogos"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>2024-10-05 - Sistema de Gest\u00e3o de Threads finalizado no meu Game Engine em C++... - Gon\u00e7alo Ferreira<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"2024-10-05 - Sistema de Gest\u00e3o de Threads finalizado no meu Game Engine em C++... - Gon\u00e7alo Ferreira\" \/>\n<meta property=\"og:description\" content=\"J\u00e1 finalizei o sistema de gest\u00e3o autom\u00e1tico de threads no meu Game Engine. E porqu\u00ea usar threads em primeiro lugar?\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/\" \/>\n<meta property=\"og:site_name\" content=\"Gon\u00e7alo Ferreira\" \/>\n<meta property=\"article:published_time\" content=\"2024-10-06T05:30:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-02-10T05:00:39+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.goncalo.pt\/por\/wp-content\/uploads\/2024\/10\/2024-10-06-Multi-Threading-Manager-finished-on-my-Cpp-Game-Engine.gif\" \/>\n\t<meta property=\"og:image:width\" content=\"494\" \/>\n\t<meta property=\"og:image:height\" content=\"278\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/gif\" \/>\n<meta name=\"author\" content=\"gnmf\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"gnmf\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/\"},\"author\":{\"name\":\"gnmf\",\"@id\":\"https:\/\/www.goncalo.pt\/por\/#\/schema\/person\/28a9f845c4de91a7c067707279b1d8dd\"},\"headline\":\"2024-10-05 &#8211; Sistema de Gest\u00e3o de Threads finalizado no meu Game Engine em C++&#8230;\",\"datePublished\":\"2024-10-06T05:30:20+00:00\",\"dateModified\":\"2025-02-10T05:00:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/\"},\"wordCount\":1503,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.goncalo.pt\/por\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.goncalo.pt\/por\/wp-content\/uploads\/2024\/10\/2024-10-06-Multi-Threading-Manager-finished-on-my-Cpp-Game-Engine.gif\",\"keywords\":[\"C++\",\"Chuva\",\"Desenvolvimento de Jogos\",\"Dev\",\"Game Dev\",\"Game Engine\",\"Motor de Jogos\",\"Multi-Threading\",\"Plaltformer\",\"Programa\u00e7\u00e3o\",\"Publicidade\",\"Rain\",\"Rel\u00e2mpagos\",\"Simula\u00e7\u00e3o\",\"Simula\u00e7\u00f5es\",\"Sonic\",\"Top\",\"Top 10 Game Engine\",\"Top 20\",\"Top Game Engine\",\"Tricky Quicky\",\"VideoGames\",\"VideoJogos\"],\"articleSection\":[\"Desenvolvimento de Jogos\",\"Design 6 Game Engine\",\"Platformers\",\"Programa\u00e7\u00e3o\",\"Projectos\",\"Retro Gaming\",\"Softwares\",\"Top\",\"Top 10 Game Engine\",\"Top 20\",\"Top Game Engine\",\"Video Jogos\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/\",\"url\":\"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/\",\"name\":\"2024-10-05 - Sistema de Gest\u00e3o de Threads finalizado no meu Game Engine em C++... - Gon\u00e7alo Ferreira\",\"isPartOf\":{\"@id\":\"https:\/\/www.goncalo.pt\/por\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.goncalo.pt\/por\/wp-content\/uploads\/2024\/10\/2024-10-06-Multi-Threading-Manager-finished-on-my-Cpp-Game-Engine.gif\",\"datePublished\":\"2024-10-06T05:30:20+00:00\",\"dateModified\":\"2025-02-10T05:00:39+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/#primaryimage\",\"url\":\"https:\/\/www.goncalo.pt\/por\/wp-content\/uploads\/2024\/10\/2024-10-06-Multi-Threading-Manager-finished-on-my-Cpp-Game-Engine.gif\",\"contentUrl\":\"https:\/\/www.goncalo.pt\/por\/wp-content\/uploads\/2024\/10\/2024-10-06-Multi-Threading-Manager-finished-on-my-Cpp-Game-Engine.gif\",\"width\":494,\"height\":278,\"caption\":\"2024-10-05 - Sistema de Gest\u00e3o de Threads finalizado no meu Game Engine em C++...\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.goncalo.pt\/por\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"2024-10-05 &#8211; Sistema de Gest\u00e3o de Threads finalizado no meu Game Engine em C++&#8230;\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.goncalo.pt\/por\/#website\",\"url\":\"https:\/\/www.goncalo.pt\/por\/\",\"name\":\"Gon\u00e7alo Ferreira\",\"description\":\"[Game Engine\/Software\/Simulation\/Trading Systems\/Full Stack] Developer, Musician, Composer, Painter, Writer, IT Trainer, Sys Admin, Ex-Trader, Skater, Strongman, Vegan, Self-Taught Neuro-Divergent Polymath, and 1001 things more. Welcome to my world!\",\"publisher\":{\"@id\":\"https:\/\/www.goncalo.pt\/por\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.goncalo.pt\/por\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.goncalo.pt\/por\/#organization\",\"name\":\"Gon\u00e7alo Ferreira\",\"url\":\"https:\/\/www.goncalo.pt\/por\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.goncalo.pt\/por\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.goncalo.pt\/por\/wp-content\/uploads\/2023\/08\/cropped-Goncalo-Ferreira-Logo-With-Face.png\",\"contentUrl\":\"https:\/\/www.goncalo.pt\/por\/wp-content\/uploads\/2023\/08\/cropped-Goncalo-Ferreira-Logo-With-Face.png\",\"width\":389,\"height\":90,\"caption\":\"Gon\u00e7alo Ferreira\"},\"image\":{\"@id\":\"https:\/\/www.goncalo.pt\/por\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"http:\/\/www.linkedin.com\/in\/GoncaloPT\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.goncalo.pt\/por\/#\/schema\/person\/28a9f845c4de91a7c067707279b1d8dd\",\"name\":\"gnmf\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.goncalo.pt\/por\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/78a295ef7300b60da1d67d4ce84359da?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/78a295ef7300b60da1d67d4ce84359da?s=96&d=mm&r=g\",\"caption\":\"gnmf\"},\"sameAs\":[\"http:\/\/www.goncalo.pt\/por\"],\"url\":\"https:\/\/www.goncalo.pt\/por\/author\/gnmf\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"2024-10-05 - Sistema de Gest\u00e3o de Threads finalizado no meu Game Engine em C++... - Gon\u00e7alo Ferreira","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/","og_locale":"en_US","og_type":"article","og_title":"2024-10-05 - Sistema de Gest\u00e3o de Threads finalizado no meu Game Engine em C++... - Gon\u00e7alo Ferreira","og_description":"J\u00e1 finalizei o sistema de gest\u00e3o autom\u00e1tico de threads no meu Game Engine. E porqu\u00ea usar threads em primeiro lugar?","og_url":"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/","og_site_name":"Gon\u00e7alo Ferreira","article_published_time":"2024-10-06T05:30:20+00:00","article_modified_time":"2025-02-10T05:00:39+00:00","og_image":[{"url":"https:\/\/www.goncalo.pt\/por\/wp-content\/uploads\/2024\/10\/2024-10-06-Multi-Threading-Manager-finished-on-my-Cpp-Game-Engine.gif","width":494,"height":278,"type":"image\/gif"}],"author":"gnmf","twitter_card":"summary_large_image","twitter_misc":{"Written by":"gnmf","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/#article","isPartOf":{"@id":"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/"},"author":{"name":"gnmf","@id":"https:\/\/www.goncalo.pt\/por\/#\/schema\/person\/28a9f845c4de91a7c067707279b1d8dd"},"headline":"2024-10-05 &#8211; Sistema de Gest\u00e3o de Threads finalizado no meu Game Engine em C++&#8230;","datePublished":"2024-10-06T05:30:20+00:00","dateModified":"2025-02-10T05:00:39+00:00","mainEntityOfPage":{"@id":"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/"},"wordCount":1503,"commentCount":0,"publisher":{"@id":"https:\/\/www.goncalo.pt\/por\/#organization"},"image":{"@id":"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/#primaryimage"},"thumbnailUrl":"https:\/\/www.goncalo.pt\/por\/wp-content\/uploads\/2024\/10\/2024-10-06-Multi-Threading-Manager-finished-on-my-Cpp-Game-Engine.gif","keywords":["C++","Chuva","Desenvolvimento de Jogos","Dev","Game Dev","Game Engine","Motor de Jogos","Multi-Threading","Plaltformer","Programa\u00e7\u00e3o","Publicidade","Rain","Rel\u00e2mpagos","Simula\u00e7\u00e3o","Simula\u00e7\u00f5es","Sonic","Top","Top 10 Game Engine","Top 20","Top Game Engine","Tricky Quicky","VideoGames","VideoJogos"],"articleSection":["Desenvolvimento de Jogos","Design 6 Game Engine","Platformers","Programa\u00e7\u00e3o","Projectos","Retro Gaming","Softwares","Top","Top 10 Game Engine","Top 20","Top Game Engine","Video Jogos"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/","url":"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/","name":"2024-10-05 - Sistema de Gest\u00e3o de Threads finalizado no meu Game Engine em C++... - Gon\u00e7alo Ferreira","isPartOf":{"@id":"https:\/\/www.goncalo.pt\/por\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/#primaryimage"},"image":{"@id":"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/#primaryimage"},"thumbnailUrl":"https:\/\/www.goncalo.pt\/por\/wp-content\/uploads\/2024\/10\/2024-10-06-Multi-Threading-Manager-finished-on-my-Cpp-Game-Engine.gif","datePublished":"2024-10-06T05:30:20+00:00","dateModified":"2025-02-10T05:00:39+00:00","breadcrumb":{"@id":"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/#primaryimage","url":"https:\/\/www.goncalo.pt\/por\/wp-content\/uploads\/2024\/10\/2024-10-06-Multi-Threading-Manager-finished-on-my-Cpp-Game-Engine.gif","contentUrl":"https:\/\/www.goncalo.pt\/por\/wp-content\/uploads\/2024\/10\/2024-10-06-Multi-Threading-Manager-finished-on-my-Cpp-Game-Engine.gif","width":494,"height":278,"caption":"2024-10-05 - Sistema de Gest\u00e3o de Threads finalizado no meu Game Engine em C++..."},{"@type":"BreadcrumbList","@id":"https:\/\/www.goncalo.pt\/por\/2024\/10\/06\/2024-10-05-sistema-de-gestao-de-threads-finalizado-no-meu-game-engine-em-cpp\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.goncalo.pt\/por\/"},{"@type":"ListItem","position":2,"name":"2024-10-05 &#8211; Sistema de Gest\u00e3o de Threads finalizado no meu Game Engine em C++&#8230;"}]},{"@type":"WebSite","@id":"https:\/\/www.goncalo.pt\/por\/#website","url":"https:\/\/www.goncalo.pt\/por\/","name":"Gon\u00e7alo Ferreira","description":"[Game Engine\/Software\/Simulation\/Trading Systems\/Full Stack] Developer, Musician, Composer, Painter, Writer, IT Trainer, Sys Admin, Ex-Trader, Skater, Strongman, Vegan, Self-Taught Neuro-Divergent Polymath, and 1001 things more. Welcome to my world!","publisher":{"@id":"https:\/\/www.goncalo.pt\/por\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.goncalo.pt\/por\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.goncalo.pt\/por\/#organization","name":"Gon\u00e7alo Ferreira","url":"https:\/\/www.goncalo.pt\/por\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.goncalo.pt\/por\/#\/schema\/logo\/image\/","url":"https:\/\/www.goncalo.pt\/por\/wp-content\/uploads\/2023\/08\/cropped-Goncalo-Ferreira-Logo-With-Face.png","contentUrl":"https:\/\/www.goncalo.pt\/por\/wp-content\/uploads\/2023\/08\/cropped-Goncalo-Ferreira-Logo-With-Face.png","width":389,"height":90,"caption":"Gon\u00e7alo Ferreira"},"image":{"@id":"https:\/\/www.goncalo.pt\/por\/#\/schema\/logo\/image\/"},"sameAs":["http:\/\/www.linkedin.com\/in\/GoncaloPT\/"]},{"@type":"Person","@id":"https:\/\/www.goncalo.pt\/por\/#\/schema\/person\/28a9f845c4de91a7c067707279b1d8dd","name":"gnmf","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.goncalo.pt\/por\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/78a295ef7300b60da1d67d4ce84359da?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/78a295ef7300b60da1d67d4ce84359da?s=96&d=mm&r=g","caption":"gnmf"},"sameAs":["http:\/\/www.goncalo.pt\/por"],"url":"https:\/\/www.goncalo.pt\/por\/author\/gnmf\/"}]}},"_links":{"self":[{"href":"https:\/\/www.goncalo.pt\/por\/wp-json\/wp\/v2\/posts\/3909"}],"collection":[{"href":"https:\/\/www.goncalo.pt\/por\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.goncalo.pt\/por\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.goncalo.pt\/por\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.goncalo.pt\/por\/wp-json\/wp\/v2\/comments?post=3909"}],"version-history":[{"count":6,"href":"https:\/\/www.goncalo.pt\/por\/wp-json\/wp\/v2\/posts\/3909\/revisions"}],"predecessor-version":[{"id":4109,"href":"https:\/\/www.goncalo.pt\/por\/wp-json\/wp\/v2\/posts\/3909\/revisions\/4109"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.goncalo.pt\/por\/wp-json\/wp\/v2\/media\/3911"}],"wp:attachment":[{"href":"https:\/\/www.goncalo.pt\/por\/wp-json\/wp\/v2\/media?parent=3909"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.goncalo.pt\/por\/wp-json\/wp\/v2\/categories?post=3909"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.goncalo.pt\/por\/wp-json\/wp\/v2\/tags?post=3909"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}